更新时间:2024-09-02 GMT+08:00

PG_CONSTRAINT

PG_CONSTRAINT系统表存储表上的检查约束、主键、唯一约束和外键约束。

表1 PG_CONSTRAINT字段

名称

类型

描述

conname

name

约束名称(不一定是唯一的)。

connamespace

oid

包含约束的命名空间的OID。

contype

"char"

  • c = 检查约束
  • f = 外键约束
  • p = 主键约束
  • u = 唯一约束
  • t = 触发器约束

condeferrable

boolean

该约束是否可以推迟。

condeferred

boolean

缺省时该约束是否可以推迟。

convalidated

boolean

约束是否有效。目前,只有外键和CHECK约束可将其设置为FALSE。

conrelid

oid

该约束所在的表;如果不是表约束则为0。

contypid

oid

该约束所在的域;如果不是一个域约束则为0。

conindid

oid

与约束关联的索引ID。

confrelid

oid

如果是外键,则为参考的表;否则为0。

confupdtype

"char"

外键更新动作代码。

  • a = 没动作
  • r = 限制
  • c = 级联
  • n =设置为null
  • d =设置为缺省

confdeltype

"char"

外键删除动作代码。

  • a = 没动作
  • r = 限制
  • c = 级联
  • n =设置为null
  • d =设置为缺省

confmatchtype

"char"

外键匹配类型。

  • f = 全部
  • p = 部分
  • u = 简单(未指定)

conislocal

boolean

是否是为关系创建的本地约束。

coninhcount

integer

约束直接继承父表的数目。继承父表数非零时,不能删除或重命名该约束。

connoinherit

boolean

是否可以被继承。

consoft

boolean

是否为信息约束(Informational Constraint)。

conopt

boolean

是否使用信息约束优化执行计划。

conkey

smallint[]

如果是表约束,则是约束控制的字段列表。

confkey

smallint[]

如果是一个外键,则是参考的字段的列表。

conpfeqop

oid[]

如果是一个外键,是做PK=FK比较的相等操作符ID的列表。

conppeqop

oid[]

如果是一个外键,是做PK=PK比较的相等操作符ID的列表。

conffeqop

oid[]

如果是一个外键,是做FK=FK比较的相等操作符ID的列表。

conexclop

oid[]

如果是一个排他约束,是列的排他操作符ID列表。

conbin

pg_node_tree

如果是检查约束,则是其表达式的内部形式。

consrc

text

如果是检查约束,则是表达式的人类可读形式。

  • 当被引用的对象改变时,consrc不能被更新。例如,它不会跟踪字段的重命名。最好还是使用pg_get_constraintdef()来抽取一个检查约束的定义,而不是依赖这个字段。
  • pg_class.relchecks需要和每个关系在此目录中的检查约束数量保持一致。

应用示例

查询指定表是否有主键。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
CREATE TABLE t1
(    
    C_CUSTKEY    BIGINT       ,
    C_NAME       VARCHAR(25)  ,
    C_ADDRESS    VARCHAR(40)  ,
    C_NATIONKEY  INT          ,
    C_PHONE      CHAR(15)     ,
    C_ACCTBAL    DECIMAL(15,2), 
    CONSTRAINT C_CUSTKEY_KEY PRIMARY KEY(C_CUSTKEY,C_NAME)
)
DISTRIBUTE BY HASH(C_CUSTKEY,C_NAME);

SELECT conname FROM pg_constraint WHERE conrelid = 't1'::regclass AND contype = 'p';
    conname
---------------
 c_custkey_key
(1 row)