[英]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
unnest
到pg_catalog.pg_attribute
中的列信息以獲取列名稱.. conrelid::regclass
將conrelid
oid
值轉換為表名。
有關詳細信息,請參閱pg_constraint 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.