postgresql – PG ::错误:错误:函数left(字符变化,整数)不存在
我正在使用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_idxn 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 exist LINE 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();
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($1,$2)'; 这通常不会在版本升级后引起冲突,因为默认情况下schema search path在公共之前具有pg_catalog(隐式),因此一旦系统函数退出,用户定义的函数就会停止运行 – 除非明确地进行模式限定.但无论如何,你应该在版本升级后删除它. 我添加了这个,建议对@Wize提供的一些改进: >出于多种原因使用LANGUGAE sql(不是plpgsql): >更短,更简单. >使用函数波动率STABLE,这是合适的并有助于提高性能. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |