在MySQL中创建非NULL约束的最佳方法是什么,fieldA和fieldB不能都是NULL。我不关心其中任何一个本身是NULL,只要其他字段具有非NULL值。如果它们都具有非NULL值,那么它甚至更好。
发布于 2018-08-27 13:34:44
使用MySQL 5.0.51a进行测试,我发现它解析了CHECK约束,但没有强制执行。我可以插入(NULL,NULL)而没有错误。测试了MyISAM和InnoDB。随后使用SHOW CREATE TABLE显示CHECK约束不在表定义中,即使我在定义表时没有给出错误。
这与MySQL手册相符,该手册说:“CHECK子句被解析但被所有存储引擎忽略。”
因此,对于MySQL,您必须使用触发器来强制执行此规则。唯一的问题是MySQL触发器无法引发错误或中止INSERT操作。您可以在触发器中执行导致错误的一件事是将NOT NULL列设置为NULL。
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
在更新之前,您还需要类似的触发器。
https://stackoverflow.com/questions/-100000660
复制相似问题