如何在mySql中的几个列上定义条件非空约束?

时间:2014-05-26 20:08:49

标签: mysql sql database

我的数据库中有一张表。该表包含几个列,例如A,B,C,D,E,F和G.我想以D,E或F中的至少一个不应为空的方式定义约束。 这可能吗? 我正在使用MySql。 感谢

2 个答案:

答案 0 :(得分:2)

不幸的是,MySQL does not support CHECK constraints。它解析它们然后默默地丢弃约束,就像它对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

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

答案 1 :(得分: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)