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