在包含可空列的表中强制唯一约束
本文讨论了在包含可空列的表上创建唯一约束的挑战。目标是防止出现多行具有相同值组合的情况,即使可空列为 null。
问题:
提供的表模式具有一个可以为 null 的 UserRepository 列。但是,用户希望确保对于每对 UserId 和 RecipeId,只有一行存在,而不管 MenuId 值如何。
答案:
PostgreSQL 15 或更高版本:
<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>
优点:
缺点(仅限部分索引):
替代方案:
以上是如何对数据库表中的可空列实施唯一约束?的详细内容。更多信息请关注PHP中文网其他相关文章!