我有下表:
ID
KEY_1
KEY_2
我希望 KEY_1 與 KEY_2 的組合是唯一的,反之亦然。
ALTER TABLE dbo.table_name
ADD CONSTRAINT uq_table_name UNIQUE(KEY_1, KEY_2);
這樣我可以使 KEY_1 和 KEY_2 之間的組合獨一無二,但我也希望反之亦然。
例子:
KEY_1 = 111;
KEY_2 = 222;
我不能再次插入這個值,或者我也不能插入這些值,反之亦然。
這不應該是有效的(因為它是同一對密鑰):
KEY_1 = 222;
KEY_2 = 111;
謝謝
uj5u.com熱心網友回復:
您可以使用唯一的功能索引而不是唯一的約束來實作這一點。
create unique index table_name_uix
on table_name (greatest(key_1, key_2), least(key_1, key_2));
Postgres 唯一約束與唯一索引的詳細資訊在這里
uj5u.com熱心網友回復:
沒有簡單的方法可以做到這一點。
- UNIQUE 只接受屬性名稱
解決此問題的一種方法是創建兩個新屬性:minatt、maxatt(因此它們是有序的),然后將這兩個屬性添加為單個 UNIQUE 約束。
您還可以有一個觸發器來自動更新這些屬性(在插入/更新期間)。這樣你就可以避免一致性問題。
另一種方法是使用觸發器來檢查約束(有點像元組約束,您可以手動檢查這些連接的唯一性(聽起來比 UNIQUE 解決方案更復雜且更容易出錯)。
uj5u.com熱心網友回復:
您可以向表中添加兩列,key_min然后key_max使用觸發器計算key_min=key_1和之間的最小值key_2;key_max=最大值之間key_1以及key_2和創建該約束UNIQUE(key_min,key_max)。您可以在此處查看使用 MariaDB 和虛擬列的類似解決方案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/352983.html
標籤:sql PostgreSQL
