如何對資料庫表中的可空列實施唯一約束?
Jan 20, 2025 pm 11:56 PM在包含可空列的表中強制唯一約束
本文討論了在包含可空列的表上建立唯一約束的挑戰。目標是防止出現多行具有相同值組合的情況,即使可空列為 null。
問題:
提供的表模式具有一個可以為 null 的 UserRepository 欄位。但是,使用者希望確保對於每對 UserId 和 RecipeId,只有一行存在,而不管 MenuId 值如何。
答案:
PostgreSQL 15 或更高版本:
- 在 UNIQUE 限制定義中使用 NULLS NOT DISTINCT 子句。
ALTER TABLE Favorites ADD CONSTRAINT Favorites_UniqueFavorite UNIQUE NULLS NOT DISTINCT (UserId, MenuId, RecipeId);
登入後複製
PostgreSQL 14 或更低版本:
- 建立兩個部分索引:
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;
登入後複製
優點:
- 有效地強制執行所需的約束。
缺點(僅限部分索引):
- 限制外鍵引用和聚類選項。
- 在某些查詢中,如果沒有符合的 WHERE 條件,則無法使用。
替代方案:
- 如果涉及多個可空列,請參考本文中的討論:「為什麼我的 UNIQUE 約束沒有觸發?」。
以上是如何對資料庫表中的可空列實施唯一約束?的詳細內容。更多資訊請關注PHP中文網其他相關文章!
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱門文章
擊敗分裂小說需要多長時間?
3 週前
By DDD
倉庫:如何復興隊友
3 週前
By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前
By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 週前
By 尊渡假赌尊渡假赌尊渡假赌
公眾號網頁更新緩存難題:如何避免版本更新後舊緩存影響用戶體驗?
3 週前
By 王林

熱門文章
擊敗分裂小說需要多長時間?
3 週前
By DDD
倉庫:如何復興隊友
3 週前
By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前
By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 週前
By 尊渡假赌尊渡假赌尊渡假赌
公眾號網頁更新緩存難題:如何避免版本更新後舊緩存影響用戶體驗?
3 週前
By 王林

熱門文章標籤

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

在 Linux 中運行 MySQl(有/沒有帶有 phpmyadmin 的 podman 容器)
