PostgreSQL 约束 (展示)

3
我需要显示我的解决方案的完整性约束列表,指示约束的名称、类型和约束详细信息(解释验证约束的内容),所有内容按表名和约束名排序。
这是我尝试过的内容:
SELECT constraint_name, constraint_type
FROM user_constraints
WHERE table_name = 'mytable'

如何展示所有内容并提示验证约束的信息?


很棒的问题!表格有11+1种约束类型。编写检索所有这些约束并以可读语言呈现它们的查询可能会很繁琐,但完全可行。我会关注答案,因为这对我可能会有用。 - The Impaler
这个回答解决了你的问题吗?如何在PostgreSQL中列出表的所有约束条件? - Schwern
你如何找到<模式名称>?@Schwern - fenton.raine
@fenton.raine 如果您不知道您正在使用的架构,则会使用默认架构“public”。请参阅https://www.postgresqltutorial.com/postgresql-schema/。 - Schwern
@fenton.raine,你介意我为这个问题开启悬赏吗?我很想看到一个好的答案。 - The Impaler
3个回答

0
请使用以下查询(此查询已在MS SQL上测试,希望您将其转换为PostgreSQL):
Select self_objects.name 'Table_Name', C.*, (Select definition From sys.default_constraints Where object_id = C.object_id) As dk_definition,
(Select definition From sys.check_constraints Where object_id = C.object_id) As ck_definition,
(Select name From sys.objects Where object_id = D.referenced_object_id) As fk_table,
(Select name From sys.columns Where column_id = D.parent_column_id And object_id = D.parent_object_id) As fk_col
From sys.objects As C
join sys.objects self_objects on
self_objects.object_id = c.parent_object_id
and self_objects.type = 'U'
Left Join (Select * From sys.foreign_key_columns) As D On D.constraint_object_id = C.object_id 
order by self_objects.name

0

这是一个不适合评论部分的注释。

我想记录一下表格有11+1种类型的约束条件:

PRIMARY KEY
  • 表格 UNIQUE 约束。
  • 表格 CHECK 约束。
  • 表格 [imported] FOREIGN KEY 约束(又称引用)。
  • 表格 [exported] FOREIGN KEY 约束(又称参照操作 RESTRICT)。
  • NOT NULL 约束。
  • PRIMARY KEY 约束。
  • UNIQUE 约束。
  • CHECK 约束。
  • 列 [imported] FOREIGN KEY 约束(又称引用)。
  • 列 [exported] FOREIGN KEY 约束(又称参照操作 RESTRICT)。
  • “部分唯一索引”伪约束,向 CREATE UNIQUE INDEX ... 语句添加 WHERE。这种类型的约束在 SQL 标准中没有包含,因此存在争议。实际上,所有主要的数据库引擎(Oracle、DB2、PostgreSQL 等)都会实现它们(尽管使用不同的策略),它们非常有效地维护数据质量。
  • 约束。

    注意:一些引擎(例如Oracle)不实施#7到#11。 对于Oracle,大多数约束都记录在表级别,即使您在列级别定义它们。


    0
    请尝试以下代码。
    SELECT
        "ns"."nspname" AS "table_schema",
        "t"."relname" AS "table_name",
        "cnst"."conname" AS "constraint_name", pg_get_constraintdef ( "cnst"."oid" ) AS "expression",
    CASE
            "cnst"."contype" 
            WHEN 'p' THEN
            'PRIMARY' 
            WHEN 'u' THEN
            'UNIQUE' 
            WHEN 'c' THEN
            'CHECK' 
            WHEN 'x' THEN
            'EXCLUDE' 
        END AS "constraint_type",
        "a"."attname" AS "column_name"
    FROM
        "pg_constraint" "cnst" 
        INNER JOIN "pg_class" "t" ON "t"."oid" = "cnst"."conrelid"
        INNER JOIN "pg_namespace" "ns" ON "ns"."oid" = "cnst"."connamespace"
        LEFT JOIN "pg_attribute" "a" ON "a"."attrelid" = "cnst"."conrelid" 
        AND "a"."attnum" = ANY ( "cnst"."conkey" )
    

    你的答案还不完整,但是已经有了一个开端。我不想让赏金白白浪费,所以我把它分配给了你。 - The Impaler

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接