为何非public schema的唯一索引在information_schema.table_constraints中不可见?
CREATE UNIQUE INDEX创建的索引不在information_schema.table_constraints中显示? 这是个很常见的PostgreSQL元数据认知问题,核心原因是PostgreSQL对「唯一约束」和「唯一索引」的元数据归类是分开的,虽然两者底层都靠唯一索引实现唯一性限制,但它们在系统中的身份不一样:
information_schema.table_constraints只存储表级约束
这个视图的作用是记录表的正式约束对象——也就是通过CREATE TABLE ... UNIQUE (key)或者ALTER TABLE ... ADD CONSTRAINT ... UNIQUE语法创建的唯一约束。这类约束属于表结构的一部分,是和表绑定的约束实体,所以会出现在这个视图里。CREATE UNIQUE INDEX创建的是独立索引对象
你用CREATE UNIQUE INDEX创建的唯一索引,本质是一个独立的索引对象,它不属于表的约束范畴,自然不会出现在table_constraints中。不过它的唯一性限制功能是完全正常的——这就是为什么你插入重复值时会收到违反unique constraint "test_index"的报错,这只是PostgreSQL统一的错误表述,实际上它对应的是你创建的唯一索引。怎么查看这类唯一索引的信息?
要查询这类唯一索引,你需要用专门的索引元数据视图:- 用标准的
information_schema.indexes:SELECT index_name, is_unique FROM information_schema.indexes WHERE table_schema = 's1' AND table_name = 'test'; - 或者用PostgreSQL原生的
pg_index系统表(信息更详细):SELECT relname AS index_name FROM pg_index i JOIN pg_class c ON i.indexrelid = c.oid WHERE i.indrelid = 's1.test'::regclass AND i.indisunique = true;
- 用标准的
如果希望你的唯一性限制被当作表约束出现在table_constraints里,可以改用约束语法创建:
ALTER TABLE s1.test ADD CONSTRAINT test_unique_key UNIQUE (key);
这样PostgreSQL会自动为这个约束创建对应的唯一索引,同时该约束会被记录在table_constraints视图中。
内容的提问来源于stack exchange,提问作者schizofrenic_bit

