sintaxis restricciones restriccion developer constraint check mysql check-constraints

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.



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

http://dev.mysql.com/doc/refman/5.6/en/identifiers.html


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.



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.