本文档解决了在包含可为空列的 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中文网其他相关文章!