К сожалению, MySQL не поддерживает ограничения проверки SQL. Вы можете определить их в своем запросе DDL по причинам совместимости, но они просто игнорируются.
Существует простая альтернатива
Вы можете создавать триггеры BEFORE INSERT
и BEFORE UPDATE
, которые либо вызывают ошибку, либо устанавливают для поля значение по умолчанию, если требования данных не выполняются.
Пример BEFORE INSERT
работы после MySQL 5.5
DELIMITER $$
CREATE TRIGGER `test_before_insert` BEFORE INSERT ON `Test`
FOR EACH ROW
BEGIN
IF CHAR_LENGTH( NEW.ID ) < 4 THEN
SIGNAL SQLSTATE '12345'
SET MESSAGE_TEXT := 'check constraint on Test.ID failed';
END IF;
END$$
DELIMITER ;
До MySQL 5.5 вы должны были вызвать ошибку, например, вызвать неопределенную процедуру.
В обоих случаях это вызывает неявный откат транзакции.
MySQL не разрешает сам оператор ROLLBACK в процедурах и триггерах.
Если вы не хотите откатывать транзакцию (INSERT / UPDATE должна проходить даже при неудачном «проверочном ограничении», вы можете перезаписать значение, используя SET NEW.ID = NULL
, которое установит id в значение по умолчанию для полей, не действительно имеет смысл для id tho
Edit:
Убрал блуждающую цитату.
Относительно оператора :=
:
В отличие от =
, оператор :=
никогда не интерпретируется как оператор сравнения. Это означает, что вы можете использовать :=
в любом допустимом операторе SQL (не только в инструкциях SET), чтобы присвоить значение переменной.
https://dev.mysql.com/doc/refman/5.6/en/assignment-operators.html
Относительно кавычек идентификатора обратного удара:
Символом кавычки идентификатора является обратный тик («` »)
Если включен режим SQL ANSI_QUOTES, также допустимо заключать идентификаторы в двойные кавычки
http://dev.mysql.com/doc/refman/5.6/en/identifiers.html