在包含可空列的表中強制唯一約束
本文討論了在包含可空列的表上建立唯一約束的挑戰。目標是防止出現多行具有相同值組合的情況,即使可空列為 null。
問題:
提供的表模式具有一個可以為 null 的 UserRepository 欄位。但是,使用者希望確保對於每對 UserId 和 RecipeId,只有一行存在,而不管 MenuId 值如何。
答案:
PostgreSQL 15 或更高版本:
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;
優點:
缺點(僅限部分索引):
替代方案:
以上是如何對資料庫表中的可空列實施唯一約束?的詳細內容。更多資訊請關注PHP中文網其他相關文章!