我有一个带有以下列的表:id,col1,col2,col3,col4,col5,col6。
Constraint说,至少要填充3列(所以最多3个NULL)。 (列未按顺序填充,因此可以填充col1,col2,col5和col3,col4,col6为NULL)
如何确保该列不为NULL时,该列在该行的其他列中是唯一的?如何确保非NULL值的组合在所有行中都是唯一的?
我目前添加了以下约束(以确保至少3个非null):
ALTER TABLE my_table
ADD CONSTRAINT my_constraint CHECK (
(
(CASE WHEN col1 IS NULL THEN 0 ELSE 1 END) +
(CASE WHEN col2 IS NULL THEN 0 ELSE 1 END) +
(CASE WHEN col3 IS NULL THEN 0 ELSE 1 END) +
(CASE WHEN col4 IS NULL THEN 0 ELSE 1 END) +
(CASE WHEN col5 IS NULL THEN 0 ELSE 1 END) +
(CASE WHEN col6 IS NULL THEN 0 ELSE 1 END)
) >= 3
)
由于所有NULL
值,这不是一个有趣的约束,但是我认为是这样;
alter table my_table add constraint chk_ugly check
( (col1 is null or col1 <> any (array_remove(array[col2, col3, col4, col5, col6], null))) and
(col2 is null or col2 <> any (array_remove(array[col1, col3, col4, col5, col6], null))) and
(col3 is null or col3 <> any (array_remove(array[col1, col2, col4, col5, col6], null))) and
(col4 is null or col4 <> any (array_remove(array[col1, col2, col3, col5, col6], null))) and
(col5 is null or col5 <> any (array_remove(array[col1, col2, col3, col4, col6], null))) and
(col6 is null or col6 <> any (array_remove(array[col1, col2, col3, col4, col5], null)))
)
我确实认为有一种更好的结构化数据的方法,每个col
和id
一行。那将是一张新桌子。话虽如此,很难对强制性的三个值施加限制。
注意:您现有的约束也可以在Postgres中简化:
ALTER TABLE my_table
ADD CONSTRAINT my_constraint CHECK (
cardinality(array_remove(array[col2, col3, col4, col5, col6], null)) >= 3
)