@sklivz:使用MySQL5.0.51A进行测试时,我发现它解析了一个检查约束,但没有强制执行它。我可以插入(空,空)而不出错。测试了myisam和innodb。随后使用show create table显示检查约束不在表定义中,即使在定义表时没有给出任何错误。
这与
MySQL manual
它说:“检查子句被解析,但被所有存储引擎忽略。”
所以对于MySQL,您必须使用触发器来强制执行这个规则。唯一的问题是MySQL触发器无法引发错误或中止插入操作。在触发器中可以做的一件事是将非空列设置为空。
CREATE TABLE foo (
FieldA INT,
FieldB INT,
FieldA_or_FieldB TINYINT NOT NULL;
);
DELIMITER //
CREATE TRIGGER FieldABNotNull BEFORE INSERT ON foo
FOR EACH ROW BEGIN
IF (NEW.FieldA IS NULL AND NEW.FieldB IS NULL) THEN
SET NEW.FieldA_or_FieldB = NULL;
ELSE
SET NEW.FieldA_or_FieldB = 1;
END IF;
END//
INSERT INTO foo (FieldA, FieldB) VALUES (NULL, 10); -- OK
INSERT INTO foo (FieldA, FieldB) VALUES (10, NULL); -- OK
INSERT INTO foo (FieldA, FieldB) VALUES (NULL, NULL); -- gives error
更新之前还需要类似的触发器。