postgresql – 如果索引不存在则创建索引
我正在开发一个函数,允许我添加索引(如果它不存在).我遇到的问题是我无法获得要比较的索引列表.有什么想法吗?
这与使用此代码解决的列创建类似的问题:
PostgreSQL中的索引名称
>索引名称在单个数据库架构中是唯一的. 如果您不关心索引的名称,可以让Postgres自动命名它: CREATE INDEX ON tbl1 (col1) 是(几乎)相同 CREATE INDEX tbl1_col1_idx ON tbl1 USING btree (col1); 除了Postgres将避免命名冲突并自动选择下一个免费名称: tbl1_col1_idx tbl1_col1_idx2 tbl1_col1_idx3 ... 就试一试吧.但显然你不想创建多个冗余索引.所以盲目地创建一个新的不是一个好主意. 测试存在 Postgres 9.3或更早 一种非常简单的测试方法是将模式限定名称转换为 SELECT 'myschema.myname'::regclass 如果它抛出异常,则该名称是免费的. DO $$ BEGIN IF NOT EXISTS ( SELECT 1 FROM pg_class c JOIN pg_namespace n ON n.oid = c.relnamespace WHERE c.relname = 'my_name' AND n.nspname = 'myschema' -- 'public' by default ) THEN CREATE INDEX my_name ON myschema.mytable (mycolumn); END IF; END$$; 这不适用于CREATE INDEX CONCURRENTLY,因为该变量不能包装在外部事务中.见下文comment by @Gregory. Postseres 9.0引入了 Postgres 9.4 您可以使用新函数to_regclass()进行检查而不抛出异常: DO $$ BEGIN IF to_regclass('myschema.my_name') IS NULL THEN CREATE INDEX my_name ON myschema.mytable (mycolumn); END IF; END$$; 如果该名称的索引(或另一个对象)不存在,则返回NULL.细节: > How to check if a table exists in a given schema Postgres 9.5 现已推出: CREATE INDEX IF NOT EXISTS ... 这也适用于CREATE INDEX,如果不是EXISTS. 但是,per documentation:
这是对象名称的简单检查.适用于此处的所有变体. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |