restricciones - La restricción CHECK en MySQL no funciona
restricciones en mysql (6)
Primero creé una tabla como
CREATE TABLE Customer (
SD integer CHECK (SD > 0),
Last_Name varchar (30),
First_Name varchar(30)
);
y luego insertó valores en esa tabla
INSERT INTO Customer values (''-2'',''abc'',''zz'');
MySQL no muestra un error, aceptó los valores.
Como mencionó joanq, MariaDB ahora parece ser compatible con las restricciones CHECK, entre otras cosas:
"Soporte para CHECK CONSTRAINT ( MDEV-7563 )".
https://mariadb.com/kb/en/mariadb/mariadb-1021-release-notes/
Desafortunadamente, MySQL no admite restricciones de comprobación de SQL. Puede definirlos en su consulta DDL por razones de compatibilidad, pero simplemente se ignoran.
Hay una alternativa simple
Puede crear BEFORE INSERT
y BEFORE UPDATE
activadores de BEFORE UPDATE
que ocasionen un error o establezcan el campo en su valor predeterminado cuando no se cumplan los requisitos de los datos.
Ejemplo de BEFORE INSERT
después de 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 ;
Antes de MySQL 5.5, tenía que provocar un error, por ejemplo, llamar a un procedimiento no definido.
En ambos casos, esto provoca una reversión de transacción implícita. MySQL no permite la declaración ROLLBACK en sí misma dentro de los procedimientos y disparadores.
Si no desea deshacer la transacción (INSERT / UPDATE debe aprobar incluso con una "restricción de verificación" fallida, puede sobrescribir el valor utilizando SET NEW.ID = NULL
que establecerá el ID en el valor predeterminado de los campos, no realmente tiene sentido para un ID THO
Editar: eliminó la comilla perdida.
Con respecto al operador: :=
A diferencia de
=
, el operador:=
nunca se interpreta como un operador de comparación. Esto significa que puede usar:=
en cualquier instrucción SQL válida (no solo en las sentencias SET) para asignar un valor a una variable.
https://dev.mysql.com/doc/refman/5.6/en/assignment-operators.html
Con respecto a las cotizaciones de identificador de retroceso:
El carácter de cita de identificador es el backtick ("` ")
Si el modo SQL ANSI_QUOTES está habilitado, también se permite citar identificadores entre comillas dobles
El Manual de referencia de MySQL dice:
La cláusula
CHECK
es analizada pero ignorada por todos los motores de almacenamiento.
Pruebe un disparador ...
mysql> delimiter //
mysql> CREATE TRIGGER trig_sd_check BEFORE INSERT ON Customer
-> FOR EACH ROW
-> BEGIN
-> IF NEW.SD<0 THEN
-> SET NEW.SD=0;
-> END IF;
-> END
-> //
mysql> delimiter ;
Espero que ayude.
La restricción CHECK
no parece implementarse en MySQL.
Vea este informe de error: https://bugs.mysql.com/bug.php?id=3464
intente con el set sql_mode = ''STRICT_TRANS_TABLES''
O SET sql_mode=''STRICT_ALL_TABLES''
CHECK
restricciones CHECK
son ignoradas por MySQL como se explica en un minúsculo comentario en los documentos: CREATE TABLE
La cláusula
CHECK
es analizada pero ignorada por todos los motores de almacenamiento.