2010-11-05 116 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