2016-04-13 12 views
0

すべての制約を1つのコンサルタントで見つけ出す必要があり、それを行う方法がわかりません。私はそれをやろうとしていますPostgreSQLの制約を見つける

は、次のクエリを聖霊降臨祭:

SELECT UPPER(conname) AS restriccion, UPPER(relname) AS tabla, UPPER(pg_catalog.pg_attribute.attname) AS columna 

FROM pg_catalog.pg_constraint, pg_catalog.pg_class, pg_catalog.pg_attribute 

WHERE contype = 'u' 

AND conrelid = pg_catalog.pg_class.oid 

AND conrelid = pg_catalog.pg_attribute.attrelid 

AND pg_catalog.pg_attribute.attnum = pg_catalog.pg_constraint.conkey[1] 

ORDER BY UPPER(conname), UPPER(relname), UPPER(pg_catalog.pg_attribute.attname); 

私がチェック制約を確認するために「C」と「U」の文字を変更し、それをやっているが、それは少し難しいです...

1つのクエリですべての制約を確認する別の方法はありますか?ありがとう!

答えて

0

チェックと固有の制約を探すために、次のことを始めましょうか?

SELECT nr.nspname AS table_schema, 
     r.relname AS table_name, 
     c.conname AS constraint_name, 
     CASE 
      WHEN c.contype = 'c' THEN c.consrc 
      END AS search_condition, 
     CASE 
      WHEN c.contype = 'u' 
       THEN split_part (split_part (pg_get_constraintdef (c.oid), '(', 2), ')', 1) 
      END AS column_names, 
     d.description AS comments 
    FROM pg_class r 
    INNER JOIN pg_namespace nr 
     ON (nr.oid = r.relnamespace) 
    INNER JOIN pg_constraint c 
     ON (c.conrelid = r.oid) 
    INNER JOIN pg_namespace nc 
     ON (nc.oid = c.connamespace) 
    LEFT OUTER JOIN pg_description d 
     ON (d.objoid = c.oid) 
    WHERE r.relkind = 'r' 
     AND c.contype IN ('c', 'u') 
    ORDER BY r.relname, 
     c.conname ; 

アップデート2016年4月14日:、NOT NULL制約はありませんpg_constraint表に記載されています。 pg_attributeテーブルには次の情報が含まれています。

SELECT nr.nspname AS table_schema, 
     r.relname AS table_name, 
     null::text AS constraint_name, 
     'Not Null'::text AS null_condition, 
     a.attname AS column_name, 
     pg_catalog.col_description (a.attrelid, a.attnum) AS comments 
    FROM pg_catalog.pg_class r 
    LEFT OUTER JOIN pg_catalog.pg_namespace nr 
     ON (nr.oid = r.relnamespace) 
    LEFT OUTER JOIN pg_catalog.pg_attribute a 
     ON (c.oid = a.attrelid 
      AND a.attnum > 0 
      AND NOT a.attisdropped) 
    WHERE r.relkind IN ('r', 'f', 'm') -- tables(r), foreign tables(f), and materialized views(m) 
     AND a.attnotnull 
    ORDER BY nr.nspname, 
     r.relname, 
     a.attname ; 
+0

もう1つだけ...非ヌル制約でどのようにクエリを実行できますか? – WhiteShadow

+0

ありがとう、私はそれを試してみましょう! – WhiteShadow

関連する問題