Sql 如何将一组列约束为全部为NULL或全部不为NULL

Sql 如何将一组列约束为全部为NULL或全部不为NULL,sql,oracle,check-constraints,Sql,Oracle,Check Constraints,假设我有一张这样的桌子 id | first name | middle name | last name 现在,name列可以是NULL,但是如果这三个列中的任何一个(例如,first name是NOT NULL),那么这三个列都必须是NOT NULL 我如何在Oracle中实施此功能?比如 alter table your_table add constraint set_of_column_chk check (nvl2(first_name, 1, 0) + nvl2(mid

假设我有一张这样的桌子

id | first name | middle name | last name
现在,
name
列可以是
NULL
,但是如果这三个列中的任何一个(例如,
first name
NOT NULL
),那么这三个列都必须是
NOT NULL

我如何在Oracle中实施此功能?

比如

alter table your_table 
  add constraint set_of_column_chk
  check (nvl2(first_name, 1, 0) + nvl2(middle_name, 1, 0) + nvl2(last_name, 1, 0) in (0, 3));


您可以使用所需的逻辑编写检查约束。 例如:

alter table yourTable
  add constraint check_not_null check
    (   
        first_name  is not null and
        middle_name is not null and
        last_name   is not null
      OR
        first_name  is null and
        middle_name is null and
        last_name   is null
    );

您可以使用所需的逻辑编写检查约束。 例如:

alter table yourTable
  add constraint check_not_null check
    (   
        first_name  is not null and
        middle_name is not null and
        last_name   is not null
      OR
        first_name  is null and
        middle_name is null and
        last_name   is null
    );

你可能需要使用一个触发器,自己写支票,至少有计划B。如果你没有从一个了解OracleWhilst的人得到更好的答案,你可以写一个检查约束,你可能想考虑一个不同的策略-隔离这些“必须都有相同的空”。列合并到不允许空值的单独表中。然后,您的约束会因行的存在或不存在而强制执行。您可能必须为此使用触发器并自己编写检查,如果您没有从更了解Oracle的人那里得到更好的答案,则至少应将其作为计划B,而您可以为此编写检查约束,您可能需要考虑一种不同的策略——将这些“必须都具有相同空值”的列隔离到不允许空值的单独表中。然后,约束由行的存在或不存在强制执行。