我在数据库中有一张表,包含了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
触发器。
有关在MySQL触发器或存储过程中引发异常的 SIGNAL
语句的更多信息,请参见http://dev.mysql.com/doc/refman/5.6/en/signal.html。
注意:事实证明,这个答案不适用于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)