在 PostgreSQL 中建立表後新增唯一約束
今天,我們將學習如何在表中的行已經建立後新增 UNIQUE
約束。
UNIQUE 約束保證一行中的資料在該列中是唯一的。因此,如果存在列 ID,則所有行都將具有唯一值,而不是重複值。
但是,即使有約束,也可能出現兩行以上的空值。
但是如果我們忘記在我們想要的列中新增 UNIQUE
怎麼辦?今天,我們將看看如何在建立表後向所需列新增唯一約束。
在 PostgreSQL 中建立表後使用 alter
語句新增唯一約束
alter
語句支援包含 UNIQUE
。在我們的示例中,我們將使用一個名為 Dog
的已經製作好的表格。
這個表有一個 tag
作為主鍵和一個 owner_id
。owner_id
未設定為 UNIQUE
,因為如果我們插入以下內容,它將完美地工作。
insert into dog values (14, 2);
輸出:
但是現在,讓我們將 UNIQUE
約束新增到列 owner_id
,看看當我們呼叫 insert
時會發生什麼。
alter table dog add constraint uniq_test UNIQUE (owner_id);
現在,當我們為資料中的重複 owner_id
呼叫 insert
時; (14, 2),這是 PostgreSQL 將返回的錯誤。
ERROR: duplicate key value violates unique constraint "uniq_test"
DETAIL: Key (owner_id)=(2) already exists.
我們定義為 uniq_test
的 UNIQUE
約束被違反了。
但是如果我們已經在表中有重複的值並新增了 UNIQUE
約束怎麼辦?在這種情況下,ALTER
將失敗並出現以下錯誤:
ERROR: could not create unique index "uniq_test"
DETAIL: Key (owner_id)=(2) is duplicated.
約束新增失敗,因為已經存在重複的鍵。那麼我們如何解決這個問題呢?
如果你已經有一個大表並且無法刪除重複值,則無法新增約束,即使你使用較舊的查詢,例如以下查詢:
create unique index uniq_test on dog (owner_id);
它將返回一個 DUPLICATE
錯誤。
PostgreSQL 這樣做是因為如果你將 UNIQUE
新增到列中,這意味著所有值都必須是唯一的。
如果你已經有重複的值,則不能期望該列是唯一的;因此,這是被捨棄的。
Hello, I am Bilal, a research enthusiast who tends to break and make code from scratch. I dwell deep into the latest issues faced by the developer community and provide answers and different solutions. Apart from that, I am just another normal developer with a laptop, a mug of coffee, some biscuits and a thick spectacle!
GitHub