如何保证两列在第三列范围内没有重复值?

问题描述 投票:0回答:1

我试图根据以下条件保证我的 POSTGRESQL 数据库上的给定表不存在重复行: 假设有三列:column_scope、column_1 和column_2。我想确保在给定的column_scope值的范围内,不存在任何行的column_2上的column_1具有相同的值,反之亦然。 也就是说,在范围内,column_1 与column_2 具有相同值的唯一方法是它们都为 NULL 或它们为同一行。

我尝试添加唯一索引(column_scope、column_1、column_2),但是这会失败,因为它不会考虑无效情况,例如:

row_1 -> (scope_1, x, NULL);
row_2 -> (scope_1, NULL, x);

row_1 -> (scope_1, x, y);
row_2 -> (scope_1, y, z);

我还尝试向表添加约束,但是我似乎无法获得正确的条件来确保column_1和column_2对于给定的column_scope没有共享值。

sql database postgresql validation indexing
1个回答
0
投票

此表达式索引实现了

UNIQUE
索引,其中
(1,2)
(2,1)
(column_1, column_2)
被视为相等

CREATE UNIQUE INDEX tbl_uni_idx ON tbl
   (column_scope, GREATEST(column_1, column_2), LEAST(column_1, column_2));

参见:

空值不被视为相等,除非您添加

NULLS NOT DISTINCT
子句 - 这需要 Postgres 15 或更高版本。参见:

© www.soinside.com 2019 - 2024. All rights reserved.