多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 47.13\. `pg_constraint` `pg_constraint`存储表上的检查约束、主键、唯一约束、外键约束和排除约束。 字段约束不会得到特殊对待。每个字段约束都等效于某些表约束。非空约束记录在 `pg_attribute`表中。 未定义的约束触发器(用`CREATE CONSTRAINT TRIGGER`创建)也在此表中产生一个条目。 在域上面的检查约束也存储在这里。 **Table 47-13\. `pg_constraint` 字段** | 名字 | 类型 | 引用 | 描述 | | --- | --- | --- | --- | | `oid` | `oid` | 行标识符(隐藏属性; 必须明确选择) | | `conname` | `name` | 约束名(不一定是唯一的!) | | `connamespace` | `oid` | `pg_namespace`.oid | 包含这个约束的名字空间的 OID | | `contype` | `char` | `c` = 检查约束, `f` = 外键约束, `p` = 主键约束, `u` = 唯一约束, `t` = 约束触发器, `x` = 排除约束 | | `condeferrable` | `bool` | 这个约束可以推迟吗? | | `condeferred` | `bool` | 缺省时这个约束是否推迟的? | | `convalidated` | `bool` | 这个约束经过验证了吗?目前,外键约束和CHECK约束只能是假 | | `conrelid` | `oid` | `pg_class`.oid | 这个约束所在的表;如果不是表约束则为 0 | | `contypid` | `oid` | `pg_type`.oid | 这个约束所在的域;如果不是一个域约束则为 0 | | `conindid` | `oid` | `pg_class`.oid | 如果是唯一、主键、外键或排除约束,则为支持这个约束的索引;否则为0 | | `confrelid` | `oid` | `pg_class`.oid | 如果是外键,则为参考的表;否则为 0 | | `confupdtype` | `char` | 外键更新操作代码: `a` = 无动作, `r` = 限制, `c` = 级联, `n` = 设置为空, `d` = 设置为缺省 | | `confdeltype` | `char` | 外键删除操作代码: `a` = 无动作, `r` = 限制, `c` = 级联, `n` = 设置为空, `d` = 设置为缺省 | | `confmatchtype` | `char` | 外键匹配类型: `f` = 全部, `p` = 部分, `s` = 简单的 | | `conislocal` | `bool` | 这个约束是为关系本地定义的。请注意,约束可以本地定义和同时继承。 | | `coninhcount` | `int4` | 这个约束直接继承祖先的数量。一个拥有非零祖先的约束不能被删除或重命名。 | | `connoinherit` | `bool` | 这个约束是为关系本地定义的。它是一个非继承的约束。 | | `conkey` | `int2[]` | `pg_attribute`.attnum | 如果是表约束(包含外键,但是不包含约束触发器),则是约束字段的列表 | | `confkey` | `int2[]` | `pg_attribute`.attnum | 如果是一个外键,是参考的字段的列表 | | `conpfeqop` | `oid[]` | `pg_operator`.oid | 如果是一个外键,是PK = FK比较的相等操作符的列表 | | `conppeqop` | `oid[]` | `pg_operator`.oid | 如果是一个外键,是PK = PK比较的相等操作符的列表 | | `conffeqop` | `oid[]` | `pg_operator`.oid | 如果是一个外键,是FK = FK比较的相等操作符的列表 | | `conexclop` | `oid[]` | `pg_operator`.oid | 如果是一个排除约束,是每个字段排除操作符的列表 | | `conbin` | `pg_node_tree` | 如果是一个检查约束,那就是其表达式的内部形式 | | `consrc` | `text` | 如果是检查约束,则是表达式的人类可读形式 | 在排除约束的情况下,`conkey`是简单列引用的唯一有用约束元素。 对于其他情况下,`conkey`出现零和必须查阅相关索引以发现受约束的表达式。 (`conkey`因此有和索引的`pg_index`.`indkey`相同的内容)。 > **Note:** `consrc`在被引用的对象改变之后不会被更新,它不会跟踪字段的名字修改。 与其依赖这个字段,最好还是使用`pg_get_constraintdef()`来抽取一个检查约束的定义。 > **Note:** `pg_class.relchecks`需要和在此表上为每个关系找到的检查约束的数目一致。