【问题标题】:PostgreSQL: constraint name is not necessarily uniquePostgreSQL:约束名称不一定是唯一的
【发布时间】:2019-09-04 18:28:15
【问题描述】:

我正在尝试列出架构中的所有外键,并针对每个键列出所涉及的列。 所以我正在查询pg_catalog.pg_constraint 和information_schema.columns 表。

我需要一种方法来区分键,进行第二次查询并检索键列列表。

我想使用约束名(pg_catalog.pg_constraint 表中的conname 列),但PostgreSQL documentation about pg_constraint 表示约束名不一定是唯一的!为什么?我在文档中找不到有关此事实的其他信息。

connamespace + conname 这对夫妇是独一无二的吗?

这是我的疑问:

从给定架构中检索外键列表:

SELECT
conname AS constraint_name,
conrelid::regclass AS referring_table, 
confrelid::regclass AS referenced_table
FROM pg_catalog.pg_constraint
WHERE contype = 'f' AND ((conrelid::regclass || '' LIKE '<my_schema_name>.%') OR (confrelid::regclass || '' LIKE '<my_schema_name>.%'))

检索给定键的列列表:

SELECT
c.column_name AS key_column
FROM information_schema.columns c
JOIN pg_catalog.pg_constraint r ON (c.table_schema || '.' || c.table_name) = (r.conrelid::regclass || '')
WHERE r.conname = '<my_constraint_name>'

感谢您的帮助。

【问题讨论】:

  • 逻辑键似乎是 (schemaname, constraint_name):名称在模式中应该是唯一的。这没有反映在 pg_catalog.pg_constraint 中,它只有在 (conname, connamespace) 上有一个非唯一索引。恕我直言,无需通过此级别的约束来强制执行唯一性。

标签: postgresql


【解决方案1】:

约束名称仅在定义它们的对象内是唯一的。

两个不同的表(或域)可以有同名的约束。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    • 2018-12-02
    • 1970-01-01
    相关资源
    最近更新 更多