如何在MySQL中定义多列的条件非空约束?

3

我在数据库中有一张表,包含了A、B、C、D、E、F和G几列。我想定义一个约束条件,使得D、E或F至少有一列不为空。 这是否可行? 我正在使用MySql。 谢谢。


我只能想到一个触发器。 - zerkms
你需要一个“before”触发器来进行检查。链接:10168408/use-a-trigger-to-stop-an-insert-or-update - Ryan Vincent
2个回答

2

不幸的是,MySQL 不支持CHECK约束。它会解析它们,然后默默地丢弃约束,就像对MyISAM表上的外键约束一样。它甚至不会警告您不支持的约束类型,我认为这是他们一个糟糕的设计决策。

以下是使用触发器的解决方案:

mysql> DELIMITER //
mysql> CREATE TRIGGER check_one_not_null BEFORE INSERT ON mytable FOR EACH ROW 
    IF COALESCE(NEW.D, NEW.E, NEW.F) IS NULL 
    THEN SIGNAL SQLSTATE '45000' 
      SET MESSAGE_TEXT = 'One of D, E, or F must have a non-null value.';
    END IF //

在同一张表上,您还应该创建一个类似的 BEFORE UPDATE 触发器。

有关在MySQL触发器或存储过程中引发异常的 SIGNAL 语句的更多信息,请参见http://dev.mysql.com/doc/refman/5.6/en/signal.html


0

注意:事实证明,这个答案不适用于MySQL,因为MySQL不检查约束。它让你假装有约束,但是什么也不做来强制执行它们。糟糕。

你不能有条件地进行NOT NULL,但是你可以定义对某些列应用约束的约束,具体取决于其他列。

例如,如果你有一个员工记录,其PAYTYPE为“H”或“S”,表示时薪或月薪,你可以这样做

CREATE TABLE EMPLOYEE (
    name VARCHAR2(100),
    paytype CHAR(1),
        CONSTRAINT paytype_check CHECK ( paytype IN ( 'H','S' ) ),
    hourly_rate NUMBER,
    salary NUMBER,
        CONSTRAINT salary_hourly_check CHECK (
            ( paytype='H' AND hourly_rate IS NOT NULL AND salary IS NULL )
            OR
            ( paytype='S' AND hourly_rate IS NULL AND salary IS NOT NULL )
        )
    );

在你的情况下,你会做类似这样的事情

CONSTRAINT d_e_f_check CHECK (d IS NOT NULL OR e IS NOT NULL OR f IS NOT NULL)

我认为MySQL实际上并不评估检查约束,但允许语法。;-/ - Ryan Vincent

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接