mysql非空约束两个_MySQL中的或非空约束

@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

更新之前还需要类似的触发器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值