2010-11-05 57 views
48

当创建PostgreSQL中的表,如果没有提供默认的约束名称将分配: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. 如果不是,应该完全避免默认名称以防止出现不一致吗?

+2

我已成为一个惯例,以避免违约的名字因为这个原因 - 你结束了在那里的每一个部署的限制有不同的名称的情况 – 2010-11-05 16:39:48

回答

18

创建隐式索引 “example_a_b_key” 的manual大约是很清楚this(“tableconstraint:这个表单为使用与CREATE TABLE相同的语法的表添加一个新的约束。“)

所以,你可以简单地运行:

 
ALTER TABLE example ADD UNIQUE (a, b); 
+4

啊!我错误地将'CONSTRAINT'包含为'ALTER TABLE example ADD CONSTRAINT UNIQUE(a,b);'并且出现错误。谢谢! – 2010-11-05 17:51:56

144

在PostgreSQL中指标的标准名称是:

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

其中后缀为下列之一:一个主键约束

  • key

    • pkey为唯一约束
    • excl一个排他条件
    • idx任何其他类型的指数
    • fkey的一个外键
    • check的检查约束

    的序列标准后缀是

    • 所有序列的seq

    证明你的独特约束的:

    注意:CREATE TABLE/UNIQUE将 为表 “榜样”

  • +8

    。非常有用,谢谢!值得添加的是外键使用后缀'fkey',并且多列外键约束似乎只包含第一列名称。 – 2010-11-05 17:39:07

    +1

    @IanMackinnon,这应该是最好的答案! – 2014-04-04 20:25:41

    +0

    此信息是黄金!您可以通过运行来确认这些,例如CREATE TABLE mytable(mycolumn numeric UNIQUE);' – jmagnusson 2014-08-08 14:45:51