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或更早
一种非常简单的测试方法是将模式限定名称转换为regclass:
SELECT 'myschema.myname'::regclass
如果它抛出异常,则该名称是免费的.
或者,在DO声明中使用的测试相同而不抛出异常:
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' --