PostgreSQL:默认约束名称

Ian*_*non 70 postgresql constraints naming-conventions

在PostgreSQL中创建表时,如果未提供,将分配默认约束名称:

CREATE TABLE example (
    a integer,
    b integer,
    UNIQUE (a, b)
);
Run Code Online (Sandbox Code Playgroud)

但是使用ALTER TABLE添加约束似乎是名称是强制性的:

ALTER TABLE example ADD CONSTRAINT my_explicit_constraint_name UNIQUE (a, b);
Run Code Online (Sandbox Code Playgroud)

这导致了我所参与的项目的一些命名不一致,并提示以下问题:

  1. 有没有一种简单的方法可以在现有表中添加一个约束,如果在表创建期间添加了该约束,它将会收到该名称?

  2. 如果没有,是否应该完全避免默认名称以防止出现不一致?

Fra*_*ens 224

PostgreSQL中索引的标准名称是:

{tablename}_{columnname(s)}_{suffix}

其中后缀为以下之一:

  • pkey 对于主键约束
  • key 对于唯一约束
  • excl 对于排除约束
  • idx 对于任何其他类型的索引
  • fkey 对于外键
  • check 对于检查约束

序列的标准后缀是

  • seq 对于所有序列

您的UNIQUE约束的证明:

注意:CREATE TABLE/UNIQUE将为表"example"创建隐式索引"example_a_b_key"

  • 非常有用,谢谢!值得补充的是,外键使用后缀`fkey`,而且多列外键约束似乎只包含第一列名. (9认同)
  • 正是通过谷歌搜索"postgresql索引命名约定"时我正在寻找的答案 (6认同)
  • 使用 PostgreSQL 版本 11,我发现主键约束的默认名称始终是“{tablename}_pkey”,并且不包括主键中使用的一列或多列的名称。 (3认同)

a_h*_*ame 31

手册是关于这很清楚(" tableconstraint:这种形式使用相同的语法增加了一个新的约束,一个表作为CREATE TABLE. ")

所以你可以简单地运行:

ALTER TABLE example ADD UNIQUE (a, b);

  • 啊! 我错误地包括`CONSTRAINT`,如`ALTER TABLE示例ADD CONSTRAINT UNIQUE(a,b);`并得到错误.谢谢! (5认同)