Purtroppo MySQL non supporta i vincoli di controllo SQL. È possibile definirli nella query DDL per motivi di compatibilità, ma vengono semplicemente ignorati.
C'è una semplice alternativa
È possibile creare BEFORE INSERT
e BEFORE UPDATE
trigger che causano un errore o impostano il campo sul valore predefinito quando i requisiti dei dati non sono soddisfatti.
Esempio per BEFORE INSERT
lavorare dopo 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 ;
Prima di MySQL 5.5 dovevi causare un errore, ad esempio chiamare una procedura non definita.
In entrambi i casi ciò provoca un rollback implicito della transazione. MySQL non consente l'istruzione ROLLBACK stessa all'interno di procedure e trigger.
Se non si desidera eseguire il rollback della transazione (INSERT / UPDATE dovrebbe passare anche con un "vincolo di controllo" non riuscito, è possibile sovrascrivere il valore utilizzando il SET NEW.ID = NULL
quale imposterà l'id sul valore predefinito dei campi, non ha davvero senso per un id Però
Modifica:
rimossa la citazione vagante.
Per quanto riguarda l' :=
operatore:
Diversamente =
, l' :=
operatore non viene mai interpretato come un operatore di confronto. Ciò significa che è possibile utilizzare :=
in qualsiasi istruzione SQL valida (non solo nelle istruzioni SET) per assegnare un valore a una variabile.
https://dev.mysql.com/doc/refman/5.6/en/assignment-operators.html
Per quanto riguarda le citazioni dell'identificatore backtick:
Il carattere di citazione dell'identificatore è il backtick ("` ")
Se la modalità SQL ANSI_QUOTES è abilitata, è anche possibile citare gli identificativi tra virgolette doppie
http://dev.mysql.com/doc/refman/5.6/en/identifiers.html