(对不起,如果这是一个重复的帖子,但我似乎找不到这个问题的例子)
我有一个包含4列的mysql表:
SomeTable
=========
ID (int)
name (varchar(255))
column1 (varchar(255))
column2 (double)
我现在要做的是添加一个约束,以便总有一个列(column1或column2)具有空值。我尝试过以下方法:
ALTER TABLE mytable
ADD CHECK (
(column1 IS NOT NULL && column2 IS NULL) ||
(column2 IS NOT NULL && column1 IS NULL)
)
但它似乎没有起作用,因为我仍然可以有这样的案例:
CASE1:
------
name: bla
column1: null
column2: null
CASE2:
------
name: bla
column1: somevalue
column2: 123
如何在运行case1和case2时出现错误?
(另外:如果我的记忆对我很好:我使用的约束可以缩短,但我不记得它是如何完成的。所以如果有人帮助我,我会很高兴!)
答案 0 :(得分:3)
好的,我想这就是你想要做的事情:
delimiter $$
DROP TRIGGER IF EXISTS trg_check_bi$$
CREATE TRIGGER trg_check_bi BEFORE INSERT ON mytable
FOR EACH ROW
BEGIN
IF(
(NEW.column1 IS NULL AND NEW.column2 IS NULL) ||
(NEW.column2 IS NOT NULL AND NEW.column1 IS NOT NULL)
)
THEN
SIGNAL SQLSTATE '44000'
SET MESSAGE_TEXT = 'check constraint failed';
END IF;
END$$
delimiter ;
基本上,此触发器在插入之前检查值,并抛出用户定义的错误。 您应该使用BEFORE UPDATE触发器执行相同的操作。 我希望这会有所帮助。
这是SQLFiddle,只需在insert语句中为column2添加值(无法保存失败的小提琴:)