【问题标题】:Getting the column name of a postgres check constraint from information_schema从 information_schema 获取 postgres 检查约束的列名
【发布时间】:2023-01-06 21:52:45
【问题描述】:

我可以使用此查询获取表的约束名称、表名称和检查约束的 check_clause:

SELECT tc.constraint_type, tc.constraint_name, tc.table_name, cc.check_clause
FROM information_schema.table_constraints tc 
JOIN information_schema.check_constraints cc ON cc.constraint_name = tc.constraint_name 
WHERE tc.table_name = $1 and tc.constraint_type = 'CHECK'

从 information_schema.constraint_column_usage 我可以获得应用 PRIMARY 或 UNIQUE 约束但不是 CHECK 约束的列:

SELECT * FROM information_schema.constraint_column_usage  where table_name = $1

这最终按照以下建议起作用:

SELECT
ccu.table_schema,
ccu.table_name,
ccu.constraint_name,
ccu.column_name,
cc.check_clause
FROM information_schema.constraint_column_usage ccu
JOIN information_schema.check_constraints cc ON ccu.constraint_name = cc.constraint_name
WHERE ccu.constraint_name IN
(
   SELECT
   constraint_name
   FROM information_schema.check_constraints
)
AND ccu.table_name = $1;

【问题讨论】:

    标签: postgresql check-constraints


    【解决方案1】:

    CHECK 约束可以存在于域和表中。要获取表列中的那些,只需执行以下操作:

    SELECT
        table_schema,
        table_name,
        column_name,
        constraint_name
    FROM
        information_schema.constraint_column_usage
    WHERE
        constraint_name IN (
            SELECT
                constraint_name
            FROM
                information_schema.check_constraints);
    

    子选择将找到数据库中的所有 CHECK 约束,而 constraint_name IN 将仅过滤为列约束。

    更新

    另一种方法是直接使用系统目录:

    
    WITH c AS (
        SELECT
            conname,
            conrelid,
            unnest(conkey) AS col_id
        FROM
            pg_catalog.pg_constraint
        WHERE
            contype = 'c'
            AND conrelid > 0
    )
    SELECT
        conrelid::regclass AS table_name,
        conname,
        attname
    FROM
        pg_catalog.pg_attribute
        JOIN c ON c.col_id = attnum
            AND conrelid = attrelid;
    
    

    上面所做的是将约束类型(contype)限制为CHECK'c',然后仅限于CTE(WITH)中表conrelid > 0上存在的那些CHECK约束,然后加入unnested 列数组(conkey)到pg_catalog.pg_attribute 中的列信息以获取列名。conrelid::regclassconrelid oid 值转换为表名。

    有关详细信息,请参阅pg_constraint

    【讨论】:

    • 第一个查询返回 PRIMARY KEY 和 UNIQUE 约束,但不返回 CHECK 约束。第二个查询返回支票但不给出列名。
    • 1) 第一个查询在这里按预期工作。您的表是否具有与CHECK 约束同名的UNIQUEPK 约束? 2) 这意味着将 conkey 扩展到表列。当我有更多时间时,我会谈到这一点。
    • 更新到系统目录查询。
    • 谢谢。我用你的 information_schema 例子给了我我想要的。
    猜你喜欢
    • 2018-04-13
    • 2022-11-19
    • 2014-02-27
    • 1970-01-01
    • 2010-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多