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.
mysql
check-constraints
JohnRaja
fuente
fuente
Respuestas:
MySQL 8.0.16 es la primera versión que admite restricciones CHECK.
Lea https://dev.mysql.com/doc/refman/8.0/en/create-table-check-constraints.html
Si usa MySQL 8.0.15 o anterior, el Manual de referencia de MySQL dice:
Prueba un disparador ...
Espero que ayude.
fuente
CHECK
restricción definida. Ahhh, eso sería demasiado sencillo ...Desafortunadamente, MySQL no admite restricciones de verificación de SQL. Puede definirlos en su consulta DDL por razones de compatibilidad, pero simplemente se ignoran.
Hay una alternativa simple
Puedes crear
BEFORE INSERT
yBEFORE UPDATE
disparadores que causen un error o establecer el campo en su valor predeterminado cuando no se cumplen los requisitos de los datos.Ejemplo para
BEFORE INSERT
trabajar después de MySQL 5.5Antes de MySQL 5.5 tenía que causar un error, por ejemplo, llamar a un procedimiento indefinido.
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 procedimientos y disparadores.
Si no desea revertir la transacción (INSERT / UPDATE debe pasar incluso con una "restricción de verificación" fallida, puede sobrescribir el valor usando el
SET NEW.ID = NULL
cual establecerá la identificación en el valor predeterminado de los campos, realmente no tiene sentido para una identificación aunqueEditar: se eliminó la cita perdida.
Sobre el
:=
operador:https://dev.mysql.com/doc/refman/5.6/en/assignment-operators.html
En cuanto a las comillas del identificador de retroceso:
http://dev.mysql.com/doc/refman/5.6/en/identifiers.html
fuente
DELIMITER
?CHECK
MySQL ignora las restricciones como se explica en un comentario minúsculo en los documentos:CREATE TABLE
fuente
CHECK
restricciones, si seCHECK
evalúa aFALSE
continuación, la inserción (o actualización) no se realiza y se produce un error.La
CHECK
restricción no parece implementarse en MySQL.Vea este informe de error: https://bugs.mysql.com/bug.php?id=3464
fuente
Como lo menciona joanq MariaDB ahora parece admitir las restricciones CHECK entre otras cosas:
"Soporte para CHECK CONSTRAINT ( MDEV-7563 )".
https://mariadb.com/kb/en/mariadb/mariadb-1021-release-notes/
fuente
Las restricciones de verificación son compatibles a partir de la versión 8.0.15 (aún no se ha lanzado)
https://bugs.mysql.com/bug.php?id=3464
fuente
Actualice a MySQL 8.0.16 para usar
checks
:Documentación de cheques MySQL
fuente
intente con
set sql_mode = 'STRICT_TRANS_TABLES'
ORSET sql_mode='STRICT_ALL_TABLES'
fuente
CHECK
restricción