Может ли запуск 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 для возврата ошибок из хранимых процедур, таких как триггеры.