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

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

Susan Sarandon
发布: 2025-01-21 00:09:13
原创
852 人浏览过

How to Create Unique Constraints with Nullable Columns in PostgreSQL?

管理 PostgreSQL 中的唯一约束和可空列

PostgreSQL 在跨允许 NULL 值的列强制执行唯一性约束时面临着独特的挑战。 多行可能共享相同的非 NULL 值,而仅 NULL 条目不同。 这需要在约束定义中仔细处理 NULL。

PostgreSQL 15 及更高版本:NULLS NOT DISTINCT 解决方案

PostgreSQL 15 及后续版本使用 NULLS NOT DISTINCT 子句简化了此过程。当将此子句添加到 UNIQUE 约束时,会将 NULL 值视为等效值。 因此,无论可空列是否包含 NULL,都只能存在具有给定非 NULL 值组合的一行。

ALTER TABLE favorites ADD CONSTRAINT favo_uni UNIQUE NULLS NOT DISTINCT (user_id, menu_id, recipe_id);
登录后复制

PostgreSQL 14 及更早版本:部分索引作为解决方法

对于较旧的 PostgreSQL 版本,推荐的方法涉及创建部分索引。 这些索引强制数据子集的唯一性,有效地单独处理 NULL。 一个索引覆盖可空列不为 NULL 的行,另一个索引处理可空列为 NULL 的行。

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;
登录后复制

重要注意事项

部分索引虽然有效,但可能会限制功能。 它们可以限制外键引用和集群选项。 如果完整索引是必需的,请考虑跨越更广泛的列集(包括可为空列)的 UNIQUE 约束。

另一个选项,虽然可能不适合所有情况,但为可为空的列分配一个非 NULL 默认值。 这简化了约束创建,但可能会影响数据完整性,具体取决于应用程序的要求。

最后,一致的命名约定至关重要。 在 PostgreSQL 中使用小写标识符可以增强可读性并避免潜在问题。

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

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