Niestety MySQL nie obsługuje ograniczeń sprawdzania SQL. Można je zdefiniować w zapytaniu DDL ze względu na zgodność, ale są one po prostu ignorowane.
Jest prosta alternatywa
Można tworzyć BEFORE INSERT
i BEFORE UPDATE
wyzwalacze, które powodują błąd lub ustawiają wartość domyślną pola, gdy wymagania danych nie są spełnione.
Przykład BEFORE INSERT
pracy po 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 ;
Przed MySQL 5.5 trzeba było spowodować błąd, np. Wywołać niezdefiniowaną procedurę.
W obu przypadkach powoduje to niejawne wycofanie transakcji. MySQL nie zezwala na samą instrukcję ROLLBACK w procedurach i wyzwalaczach.
Jeśli nie chcesz wycofywać transakcji (INSERT / UPDATE powinno przejść nawet przy nieudanym "ograniczeniu sprawdzającym" możesz nadpisać wartość używając SET NEW.ID = NULL
która ustawi id na wartość domyślną pola, nie ma to sensu dla id Chociaż
Edycja:
Usunięto zbłąkany cytat.
W odniesieniu do :=
operatora:
W przeciwieństwie do =
tego :=
operator nigdy nie jest interpretowany jako operator porównania. Oznacza to, że możesz użyć :=
w dowolnej prawidłowej instrukcji SQL (nie tylko w instrukcjach SET), aby przypisać wartość do zmiennej.
https://dev.mysql.com/doc/refman/5.6/en/assignment-operators.html
Odnośnie cudzysłowów identyfikatora odwrotnego znaku:
Znakiem cudzysłowu identyfikatora jest lewy przycisk („„ ”)
Jeśli tryb ANSI_QUOTES SQL jest włączony, dozwolone jest również cytowanie identyfikatorów w podwójnych cudzysłowach
http://dev.mysql.com/doc/refman/5.6/en/identifiers.html