postgresql – PG ::错误:错误:函数left(字符变化,整数)不存在

postgresql – PG ::错误:错误:函数left(字符变化,整数)不存在,第1张

概述我正在使用PostgreSQL和Rails 3.2.我的一个db迁移具有以下内容: execute <<-SQL CREATE INDEX users_multi_idx ON users (lower(left(fname, 1)), fname) WHERE deleted_at IS NULL;SQL 在某些dbs上迁移时,我们收到以下错误: == AddFnameIndex 我正在使用Postgresql和Rails 3.2.我的一个db迁移具有以下内容:

execute <<-sql  CREATE INDEX users_multi_IDx  ON users (lower(left(fname,1)),fname)  WHERE deleted_at IS NulL;sql

在某些dbs上迁移时,我们收到以下错误:

==  AddFnameIndexToUsers: migrating ===========================================-- execute("      CREATE INDEX users_multi_IDx\n      ON users (lower(left(fname,fname)\n      WHERE deleted_at IS NulL;\n")rake aborted!An error has occurred,this and all later migrations canceled:PG::Error: ERROR:  function left(character varying,integer) does not existliNE 2:       ON users (lower(left(fname,fname)                              ^HINT:  No function matches the given name and argument types. You might need to add explicit type casts.:       CREATE INDEX users_multi_IDx      ON users (lower(left(fname,fname)      WHERE deleted_at IS NulL;

奇怪的是,这不会发生在所有dbs上,只有一些(暂存).关于这个索引执行有什么问题的任何建议?

解决方法 你标记它 postgresql-9.1,但我强烈怀疑你在这里处理旧版本.当你问:你得到什么:

SELECT version();

left()是在9.1版本中引入的.对于旧版本,使用以下代码替换left(fname,1):

substr(fname,1,1)

直接替换

如果由于某种原因无法修改查询(like @Wize),则可以在9.1之前为旧版本创建插件替换:

CREATE OR REPLACE FUNCTION public.left(text,int) RETURNS text LANGUAGE sql Stable COST 30 AS'SELECT substr(,)';

这通常不会在版本升级后引起冲突,因为默认情况下schema search path在公共之前具有pg_catalog(隐式),因此一旦系统函数退出,用户定义的函数就会停止运行 – 除非明确地进行模式限定.但无论如何,你应该在版本升级后删除它.

我添加了这个,建议对@Wize提供的一些改进:

>出于多种原因使用LANGUGAE sql(不是plpgsql):

>更短,更简单.
> plpgsql is not installed by default in versions before 9.0,所以你可能遇到另一个问题,就像你想要解决的问题一样.
>我提供的简单函数可以是inlined,它可以在更大的查询环境中提高性能.

>使用函数波动率Stable,这是合适的并有助于提高性能.
>使用$n表示法来引用函数参数,因为旧版本中的sql函数不支持参数名称.
>显式创建公共模式中的函数.否则,它可能在当前用户“私有”架构中创建,而不适用于其他用户.根据您的schema search path,这应该是最好的.>使用数据类型文本,这是默认字符类型,与left()或substr()返回相同.也适用于varchar.

总结

以上是内存溢出为你收集整理的postgresql – PG ::错误:错误:函数left(字符变化,整数)不存在全部内容,希望文章能够帮你解决postgresql – PG ::错误:错误:函数left(字符变化,整数)不存在所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1162202.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存