MySQL 检查约束,其中两列中的任何一列应为空



(抱歉,如果这是一个重复的帖子,但我似乎找不到这个问题的例子)

我有一个包含 4 列的 mysql 表,如下所示:

SomeTable
=========
ID (int)
name (varchar(255))
column1 (varchar(255))
column2 (double)

我现在要做的是添加一个约束,以便始终有一列(列 1 或列 2)具有空值。我尝试了以下方法:

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

我怎样才能让它工作,以便在尝试案例 1 和案例 2 时出现错误?

(另外:如果我没记错的话:我使用的约束可以缩短,但我不记得它是如何完成的。所以如果有人也帮助我,我会很高兴!

好的,我想这就是你想要做的:

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 ;

基本上,此触发器在插入之前检查值,并引发用户定义的错误。您应该对更新前触发器执行相同的操作。我希望这有所帮助。

这是 SQLFiddle,只需在插入语句中为 column2 添加值(无法保存失败的小提琴:))

最新更新