簡體   English   中英

從 information_schema 獲取 postgres 檢查約束的列名

[英]Getting the column name of a postgres check constraint from information_schema

我可以使用此查詢獲取表的約束名稱、表名稱和檢查約束的 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;

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);

sub select 將查找數據庫中的所有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 )限制為'c'用於CHECK ,然后僅限於 CTE( WITH )中表conrelid > 0上存在的那些CHECK約束,然后加入未conkey unnestpg_catalog.pg_attribute中的列信息以獲取列名稱.. conrelid::regclassconrelid oid值轉換為表名。

有關詳細信息,請參閱pg_constraint

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM