首页 >数据库 >mysql教程 >如何对数据库表中的可空列实施唯一约束?

如何对数据库表中的可空列实施唯一约束?

Barbara Streisand
Barbara Streisand原创
2025-01-20 23:56:13186浏览

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