使一行中的所有非空值都唯一

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

我有一个带有以下列的表: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
    )
sql postgresql check-constraints
1个回答
1
投票

由于所有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))) 
     )

我确实认为有一种更好的结构化数据的方法,每个colid一行。那将是一张新桌子。话虽如此,很难对强制性的三个值施加限制。

注意:您现有的约束也可以在Postgres中简化:

ALTER TABLE my_table
    ADD CONSTRAINT my_constraint CHECK (
        cardinality(array_remove(array[col2, col3, col4, col5, col6], null)) >= 3
    )
© www.soinside.com 2019 - 2024. All rights reserved.