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