PostgreSQL:默认约束名称


85

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

CREATE TABLE example (
    a integer,
    b integer,
    UNIQUE (a, b)
);

但是使用ALTER TABLE添加约束似乎必须使用名称:

ALTER TABLE example ADD CONSTRAINT my_explicit_constraint_name UNIQUE (a, b);

这导致了我从事的项目的命名不一致,并提示了以下问题:

  1. 有没有一种简单的方法可以将约束添加到现有表中,该约束的名称是在表创建过程中添加时将收到的名称?

  2. 如果不是,是否应完全避免使用默认名称以防止不一致?


3
出于这个原因,我有一条规避默认名称的规则-您最终遇到的情况是,在每个部署中约束都具有不同的名称。
Paul Tomblin

Answers:


35

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

因此,您可以简单地运行:

ALTER TABLE示例ADD UNIQUE(a,b);

5
啊! 我错误地添加了CONSTRAINT喜欢ALTER TABLE example ADD CONSTRAINT UNIQUE (a, b);并得到错误。谢谢!
伊恩·麦金农

275

PostgreSQL中索引的标准名称是:

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

后缀是以下之一:

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

序列的标准后缀是

  • seq 对于所有序列

您唯一约束的证明:

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


10
非常有用,谢谢!值得补充的是,外键使用后缀fkey,而多列外键约束似乎仅包括第一列名称。
伊恩·麦金农

1
@IanMackinnon,这应该是最好的答案!
Marcio Mazzucato 2014年

此信息是黄金!您可以通过运行例如CREATE TABLE mytable (mycolumn numeric UNIQUE);
jmagnusson 2014年

6
正是我在搜寻“ postgresql索引命名约定”时正在寻找的答案
Fancy John

1
@someone ah抱歉,我想我的意思是E.4.3.3 Utility Commands的结尾。这是E.4.3.4数据类型之前的最后一个项目符号:“在为外键选择默认约束名称时使用所有键列的名称(Peter Eisentraut)”
Michael Hewson
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.