在 PostgreSQL 中建立表後新增唯一約束

Bilal Shahid 2024年2月15日
在 PostgreSQL 中建立表後新增唯一約束

今天,我們將學習如何在表中的行已經建立後新增 UNIQUE 約束。

UNIQUE 約束保證一行中的資料在該列中是唯一的。因此,如果存在列 ID,則所有行都將具有唯一值,而不是重複值。

但是,即使有約束,也可能出現兩行以上的空值。

但是如果我們忘記在我們想要的列中新增 UNIQUE 怎麼辦?今天,我們將看看如何在建立表後向所需列新增唯一約束。

在 PostgreSQL 中建立表後使用 alter 語句新增唯一約束

alter 語句支援包含 UNIQUE。在我們的示例中,我們將使用一個名為 Dog 的已經製作好的表格。

已經做好的表 - 狗

這個表有一個 tag 作為主鍵和一個 owner_idowner_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_testUNIQUE 約束被違反了。

但是如果我們已經在表中有重複的值並新增了 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 新增到列中,這意味著所有值都必須是唯一的。

如果你已經有重複的值,則不能期望該列是唯一的;因此,這是被捨棄的。

作者: Bilal Shahid
Bilal Shahid avatar Bilal Shahid avatar

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