Проверочное ограничение mysql, где любой из двух столбцов должен быть нулевым

(Извините, если это повторяющийся пост, но я не могу найти пример для этой проблемы)

У меня есть таблица MySQL с 4 столбцами, как это:

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?

(Дополнительно: если моя память хорошо мне помогает: ограничение, которое я использовал, может быть сокращено, но я не могу вспомнить, как это было сделано. Поэтому я был бы рад, если бы кто-то мне тоже помог с этим!)

1 ответ

Решение

Хорошо, я думаю, это то, что вы хотите сделать:

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, просто добавьте значение для column2 в операторе вставки (невозможно сохранить скрипту, которая не работает:))

Другие вопросы по тегам