Postgresql

如何解決 Postgres 中重複的約束名稱?

  • May 21, 2021

在 Postgres 9.6 上,我有一個表,其中外鍵約束和唯一約束具有相同的名稱(最終由於長不同的名稱被靜默截斷為 63 個字元)。我正在嘗試通過 解決此名稱衝突ALTER TABLE RENAME CONSTRAINT,但這會產生錯誤:

table x has multiple constraints named "y"

這聽起來像是為了重命名約束,我首先需要……重命名約束。🤔

那麼,我該怎麼做呢?

(旁注:PostgreSQL 11 的發行說明有“完全強製表和域約束名稱的唯一性”,暗指這種情況,我想,正如我在準備升級時發現的那樣。)

重現的最小步驟:

create table t1 (id uuid primary key);
create table t2 (id uuid primary key);
alter table t1 add constraint oops foreign key (id) references t2 (id);
alter table t1 add constraint oops unique (id);
alter table t1 rename constraint oops to oopsie;

我的解決方案是刪除並重新創建約束,其中一個被賦予不同的名稱。Postgres 將讓我按名稱刪除一個約束,但我不知道它如何選擇哪一個,或者它是否是確定性的,因此腳本編寫的安全路線是刪除兩者並從那裡重新創建。在上述情況下,這將是這樣的:

alter table t1 
   drop constraint oops, 
   drop constraint oops,
   add constraint oops foreign key (id) references t2 (id),
   add constraint oops_unique unique (id);

幸運的是,我的桌子足夠小,可以作為一個實用的解決方案。如果不是,我會pg_constraint按照 Laurenz 的建議嘗試直接更新。

引用自:https://dba.stackexchange.com/questions/291830