繁体   English   中英

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

[英]How can I define conditional non-null constraints on several columns in mySql?

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

不幸的是,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

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

注意:事实证明这个答案不适用于MySQL,因为MySQL不检查约束。 它可以让你假装你有约束,但没有做任何事情来强制执行它们。 哎呀。

您不能有条件地执行NOT NULL,但您可以根据其他列定义适用于某些列的约束。

例如,如果您有每小时或工资的PAYTYPE为“H”或“S”的EMPLOYEE记录,您可以执行此操作

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM