Может ли запуск MySQL имитировать ограничение CHECK?
Я хочу использовать ограничение CHECK в MySQL, но оно не поддерживается. (В отличие от других СУБД, он будет понимать, но не применять ПРОВЕРКИ.)
Я видел некоторые обходные пути с триггерами. Но они, как правило, устанавливают значение по умолчанию для рассматриваемого поля, а не возвращают ошибку.
Можно ли построить триггер, который возвращает ошибку, если условие не выполнено?
В конечном итоге я хочу, чтобы триггер копировал ограничение CHECK.
Ответы
Ответ 1
Попробуйте выполнить следующий синтаксис
CREATE TRIGGER mytabletriggerexample
BEFORE INSERT
FOR EACH ROW BEGIN
IF(NEW.important_value) < (fancy * dancy * calculation) THEN
DECLARE dummy INT;
SELECT Your meaningful error message goes here INTO dummy
FROM mytable
WHERE mytable.id=new.id
END IF; END;
Ответ 2
при обновлении данных:
delimiter $$
create trigger chk_stats1 before update on stats
for each row
begin
if new.month>12 then
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Cannot add or update row: only';
end if;
end;
$$
когда вы вставляете данные:
delimiter $$
create trigger chk_stats before insert on stats
for each row
begin
if new.month>12 then
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Cannot add or update row: only';
end if;
end;
$$
этот триггер будет работать как контрольное ограничение, работать до вставки или обновления и проверять месяц, если месяц > 12 дает ошибку.
Ответ 3
Начиная с MySQL 5.5, вы можете использовать синтаксис SIGNAL для возврата ошибок из хранимых процедур, таких как триггеры.