首頁 >資料庫 >mysql教程 >如何對資料庫表中的可空列實施唯一約束?

如何對資料庫表中的可空列實施唯一約束?

Barbara Streisand
Barbara Streisand原創
2025-01-20 23:56:13248瀏覽

How to Enforce Unique Constraints with Nullable Columns in a Database Table?

在包含可空列的表中強制唯一約束

本文討論了在包含可空列的表上建立唯一約束的挑戰。目標是防止出現多行具有相同值組合的情況,即使可空列為 null。

問題:

提供的表模式具有一個可以為 null 的 UserRepository 欄位。但是,使用者希望確保對於每對 UserId 和 RecipeId,只有一行存在,而不管 MenuId 值如何。

答案:

PostgreSQL 15 或更高版本:

  • 在 UNIQUE 限制定義中使用 NULLS NOT DISTINCT 子句。
<code class="language-sql">ALTER TABLE Favorites
ADD CONSTRAINT Favorites_UniqueFavorite UNIQUE NULLS NOT DISTINCT (UserId, MenuId, RecipeId);</code>

PostgreSQL 14 或更低版本:

  • 建立兩個部分索引:
<code class="language-sql">CREATE UNIQUE INDEX favo_3col_uni_idx ON Favorites (UserId, MenuId, RecipeId)
WHERE MenuId IS NOT NULL;

CREATE UNIQUE INDEX favo_2col_uni_idx ON Favorites (UserId, RecipeId)
WHERE MenuId IS NULL;</code>

優點:

  • 有效地強制執行所需的約束。

缺點(僅限部分索引):

  • 限制外鍵引用和聚類選項。
  • 在某些查詢中,如果沒有符合的 WHERE 條件,則無法使用。

替代方案:

  • 如果涉及多個可空列,請參考本文中的討論:「為什麼我的 UNIQUE 約束沒有觸發?」。

以上是如何對資料庫表中的可空列實施唯一約束?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn