MySQL :: MySQL 8.0 Reference Manual :: 13.1.20.6 CHECK Constraints

13.1.20.6 CHECK Constraints

Prior to MySQL 8.0.16, CREATE TABLE permits only the following limited version of table CHECK constraint syntax, which is parsed and ignored:

CHECK (expr)

As of MySQL 8.0.16, CREATE TABLE permits the core features of table and column CHECK constraints, for all storage engines. CREATE TABLE permite la siguiente sintaxis de restricción CHECK, para restricciones de tabla y restricciones de columna:

] CHECK (expr) ENFORCED]

La opción symbol especifica un nombre para la restricción. Si se omite, MySQL genera un nombre a partir del nombre de la tabla, un literal _chk_, y un número ordinal (1, 2, 3,…). Los nombres de restricción tienen una longitud máxima de 64 caracteres. Son sensibles a mayúsculas y minúsculas, pero no sensibles al acento.

expr especifica la condición de restricción como una expresión booleana que debe evaluarse en TRUE o UNKNOWN (para valores NULL) para cada fila de la tabla. Si la condición se evalúa como FALSE, se produce un error y se produce una violación de restricción. El efecto de una violación depende de la declaración que se está ejecutando, como se describe más adelante en esta sección.

La cláusula de cumplimiento opcional indica si se aplica la restricción:

  • Si se omite o se especifica como ENFORCED, la restricción es creado y forzada.

  • Si se especifica como NOT ENFORCED, la restricción se crea pero no se aplica.

A CHECK La restricción se especifica como una restricción de tabla o una restricción de columna:

  • Una restricción de tabla no aparece dentro de una definición de columna y puede hacer referencia a cualquier columna o columnas de tabla. Se permiten referencias directas a las columnas que aparecen más adelante en la definición de la tabla.

  • Una restricción de columna aparece dentro de una definición de columna y solo puede referirse a esa columna.

Considere esta definición de tabla:

CREATE TABLE t1( CHECK (c1 <> c2), c1 INT CHECK (c1 > 10), c2 INT CONSTRAINT c2_positive CHECK (c2 > 0), c3 INT CHECK (c3 < 100), CONSTRAINT c1_nonzero CHECK (c1 <> 0), CHECK (c1 > c3));

La definición incluye restricciones de tabla y restricciones de columna, en formatos con nombre y sin nombre:

  • La primera restricción es una restricción de tabla: Se produce fuera de cualquier definición de columna, por lo que puede (y lo hace) se refiere a varias columnas de tabla. Esta restricción contiene referencias a columnas no definidas todavía. No se especifica ningún nombre de restricción, por lo que MySQL genera un nombre.

  • Las siguientes tres restricciones son restricciones de columna: Cada una se produce dentro de una definición de columna y, por lo tanto, solo puede referirse a la columna que se está definiendo. Una de las restricciones se nombra explícitamente. MySQL genera un nombre para cada uno de los otros dos.

  • Las dos últimas restricciones son restricciones de tabla. Uno de ellos se nombra explícitamente. MySQL genera un nombre para el otro.

Como se mencionó, MySQL genera un nombre para cualquier restricción CHECK especificada sin una. Para ver los nombres generados para la definición de tabla anterior, use SHOW CREATE TABLE:

mysql> SHOW CREATE TABLE t1\G*************************** 1. row *************************** Table: t1Create Table: CREATE TABLE `t1` ( `c1` int(11) DEFAULT NULL, `c2` int(11) DEFAULT NULL, `c3` int(11) DEFAULT NULL, CONSTRAINT `c1_nonzero` CHECK ((`c1` <> 0)), CONSTRAINT `c2_positive` CHECK ((`c2` > 0)), CONSTRAINT `t1_chk_1` CHECK ((`c1` <> `c2`)), CONSTRAINT `t1_chk_2` CHECK ((`c1` > 10)), CONSTRAINT `t1_chk_3` CHECK ((`c3` < 100)), CONSTRAINT `t1_chk_4` CHECK ((`c1` > `c3`))) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

El estándar SQL especifica que todos los tipos de restricciones (clave primaria, índice único, clave foránea, comprobación) pertenecen al mismo espacio de nombres. En MySQL, cada tipo de restricción tiene su propio espacio de nombres por esquema (base de datos). En consecuencia, CHECK los nombres de restricción deben ser únicos por esquema; no hay dos tablas en el mismo esquema que puedan compartir un nombre de restricción CHECK. (Excepción: Una tabla TEMPORARY oculta una tabla que no esTEMPORARY del mismo nombre, por lo que también puede tener los mismos nombres de restricción CHECK.)

Comenzar los nombres de restricción generados con el nombre de la tabla ayuda a garantizar la unicidad del esquema, ya que los nombres de tabla también deben ser únicos dentro del esquema.

CHECK expresiones de condición deben cumplir las siguientes reglas. Se produce un error si una expresión contiene construcciones no permitidas.

  • Se permiten columnas no generadas y generadas, excepto las columnas con el atributo AUTO_INCREMENT y columnas en otras tablas.

  • Se permiten literales, funciones deterministas integradas y operadores. Una función es determinista si, dados los mismos datos en tablas, múltiples invocaciones producen el mismo resultado, independientemente del usuario conectado. Ejemplos de funciones que no son deterministas y fallar esta definición: CONNECTION_ID()CURRENT_USER()NOW().

  • No se permiten funciones almacenadas ni funciones definidas por el usuario.

  • No se permiten los parámetros de procedimiento y función almacenados. Las variables

  • (variables de sistema, variables definidas por el usuario y variables locales de programa almacenadas) no están permitidas.

  • No se permiten subconsultas.

Foreign key acciones referenciales (ON UPDATEON DELETE) están prohibidos en las columnas utilizadas en el CHECK restricciones. Likewise, CHECK constraints are prohibited on columns used in foreign key referential actions.

CHECK constraints are evaluated for INSERTUPDATEREPLACELOAD DATA, and LOAD XML statements and an error occurs if a constraint evaluates to FALSE. Si se produce un error, el manejo de los cambios ya aplicados difiere para los motores de almacenamiento transaccional y no transaccional, y también depende de si el modo SQL estricto está en vigor, como se describe en el Modo SQL estricto.

CHECK restricciones son evaluados por INSERT IGNOREUPDATE IGNORELOAD DATA ... IGNORE y LOAD XML ... IGNORE estados de cuenta y se produce una advertencia si una restricción evalúa a FALSE. Se omite la inserción o actualización de cualquier fila infractora.

Si la expresión de restricción se evalúa a un tipo de datos que difiere del tipo de columna declarado, la coerción implícita al tipo declarado se produce de acuerdo con las reglas habituales de conversión de tipos MySQL. Consulte la Sección 12.3, «Conversión de tipos en la Evaluación de expresiones». Si la conversión de tipos falla o resulta en una pérdida de precisión, se produce un error.

Nota

La evaluación de expresiones de restricción utiliza el modo SQL vigente en el momento de la evaluación. Si algún componente de la expresión depende del modo SQL, pueden producirse resultados diferentes para diferentes usos de la tabla, a menos que el modo SQL sea el mismo durante todos los usos.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.