本文檔解決了在包含可為空白列的 PostgreSQL 表中強制執行唯一約束的挑戰。 出現此問題的原因是,預設情況下,NULL 值被視為彼此不同。 當可空列保留 NULL 時,這允許多行具有相同的非 NULL 值。 該解決方案旨在建立一個將 NULL 視為等效的唯一限制。
目標是建立一個唯一約束,防止基於特定列的重複行,即使可空列包含 NULL 值也是如此。
PostgreSQL 15 及更高版本:
PostgreSQL 15 引入了 NULLS NOT DISTINCT
子句,提供了一個簡單的解決方案。此子句確保 NULL 值在唯一約束內被視為相同。 以下命令示範了其用法:
<code class="language-sql">ALTER TABLE favorites ADD CONSTRAINT favo_uni UNIQUE NULLS NOT DISTINCT (user_id, menu_id, recipe_id);</code>
PostgreSQL 14 及更早版本:
對於較舊的 PostgreSQL 版本,NULLS NOT DISTINCT
子句不可用。 此解決方案需要建立兩個部分唯一索引:
<code class="language-sql">CREATE UNIQUE INDEX favo_3col_uni_idx ON favorites (user_id, menu_id, recipe_id) WHERE menu_id IS NOT NULL; CREATE UNIQUE INDEX favo_2col_uni_idx ON favorites (user_id, recipe_id) WHERE menu_id IS NULL;</code>
這種方法有效地增強了唯一性。第一個索引處理 menu_id
不為 NULL 的情況,而第二個索引處理 menu_id
為 NULL 的情況。 當 (user_id, recipe_id)
為 NULL 時,這可以防止 menu_id
的重複組合。
以上是如何在 Postgres 中使用可空列建立唯一約束?的詳細內容。更多資訊請關注PHP中文網其他相關文章!