首页 > 数据库 > mysql教程 > 如何在 Postgres 中使用可空列创建唯一约束?

如何在 Postgres 中使用可空列创建唯一约束?

DDD
发布: 2025-01-21 00:12:08
原创
265 人浏览过

How to Create a Unique Constraint in Postgres with Nullable Columns?

在 PostgreSQL 中处理可空列的唯一约束

本文档解决了在包含可为空列的 PostgreSQL 表中强制执行唯一约束的挑战。 出现此问题的原因是,默认情况下,NULL 值被视为彼此不同。 当可空列保留 NULL 时,这允许多行具有相同的非 NULL 值。 该解决方案旨在创建一个将 NULL 视为等效的唯一约束。

解决问题

目标是创建一个唯一约束,防止基于特定列的重复行,即使可空列包含 NULL 值也是如此。

解决方案

PostgreSQL 15 及更高版本:

PostgreSQL 15 引入了 NULLS NOT DISTINCT 子句,提供了一个简单的解决方案。该子句确保 NULL 值在唯一约束内被视为相同。 以下命令演示了其用法:

<code class="language-sql">ALTER TABLE favorites
ADD CONSTRAINT favo_uni UNIQUE NULLS NOT DISTINCT (user_id, menu_id, recipe_id);</code>
登录后复制

PostgreSQL 14 及更早版本:

对于较旧的 PostgreSQL 版本,NULLS NOT DISTINCT 子句不可用。 该解决方案需要创建两个部分唯一索引:

<code class="language-sql">CREATE UNIQUE INDEX favo_3col_uni_idx ON favorites (user_id, menu_id, recipe_id)
WHERE menu_id IS NOT NULL;

CREATE UNIQUE INDEX favo_2col_uni_idx ON favorites (user_id, recipe_id)
WHERE menu_id IS NULL;</code>
登录后复制

这种方法有效地增强了唯一性。第一个索引处理 menu_id 不为 NULL 的情况,而第二个索引处理 menu_id 为 NULL 的情况。 当 (user_id, recipe_id) 为 NULL 时,这可以防止 menu_id 的重复组合。

以上是如何在 Postgres 中使用可空列创建唯一约束?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板