MariaDB admite la implementación de restricciones a nivel de tabla utilizando CREATE TABLE o ALTER TABLE declaraciones. Una restricción de tabla restringe los datos que puede agregar a la tabla. Si intenta insertar datos no válidos en una columna, MariaDB arroja un error.

Sintaxis

[CONSTRAINT[symbol]] constraint_expression

constraint_expression:
  |PRIMARYKEY[index_type](index_col_name,...)[index_option]...|FOREIGNKEY[index_name](index_col_name,...)REFERENCES tbl_name (index_col_name,...)[ONDELETE reference_option][ONUPDATE reference_option]|UNIQUE[INDEX|KEY][index_name][index_type](index_col_name,...)[index_option]...|CHECK(check_constraints)

index_type:
  USING HASH

index_col_name:
  col_name [(length)][ASC|DESC]

index_option:
  | KEY_BLOCK_SIZE [=]value| index_type
  |WITH PARSER parser_name
  |COMMENT'string'| CLUSTERING=YES

reference_option:
  RESTRICT|CASCADE|SETNULL|NOACTION|SETDEFAULT

Descripción

Las restricciones proporcionan restricciones sobre los datos que puede agregar a una tabla. Esto le permite hacer cumplir la integridad de los datos desde MariaDB, en lugar de a través de la lógica de la aplicación. Cuando una declaración viola una restricción, MariaDB arroja un error.

Hay cuatro tipos de restricciones de tabla:

Restricción Descripción
PRIMARY KEY Establece la columna para hacer referencia a filas. Los valores deben ser únicos y no nulos.
FOREIGN KEY Establece la columna para hacer referencia a la clave principal en otra tabla.
UNIQUE Requiere valores en columna o las columnas solo aparecen una vez en la tabla.
CHECK Comprueba si los datos cumplen la condición indicada.

Restricciones FOREIGN KEY

InnoDB admite restricciones de clave externa. La sintaxis para una definición de restricción de clave externa en InnoDB se ve así:

[CONSTRAINT[symbol]]FOREIGNKEY[index_name](index_col_name,...)REFERENCES tbl_name (index_col_name,...)[ONDELETE reference_option][ONUPDATE reference_option]

reference_option:
    RESTRICT|CASCADE|SETNULL|NOACTION

VERIFICAR Restricciones

MariaDB comenzando con 10.2.1

De MariaDB 10.2.1, se aplican las restricciones. Antes MariaDB 10.2.1 Las expresiones de restricción se aceptaron en la sintaxis pero se ignoraron.

En MariaDB 10.2.1 puede definir restricciones de 2 formas diferentes:

  • CHECK(expression) dado como parte de una definición de columna.
  • CONSTRAINT [constraint_name] CHECK (expression)

Antes de insertar o actualizar una fila, todas las restricciones se evalúan en el orden en que se definen. Si alguna expresión de restricción devuelve falso, la fila no se insertará ni actualizará. Se pueden utilizar la mayoría de las funciones deterministas en una restricción, incluidas las UDF.

CREATETABLE t1 (a INTCHECK(a>2), b INTCHECK(b>2),CONSTRAINT a_greater CHECK(a>b));

Si usa el segundo formato y no le da un nombre a la restricción, entonces la restricción obtendrá un nombre generado automáticamente. Esto se hace para que luego pueda eliminar la restricción con ALTER TABLE DROP nombre_restricción.

Uno puede deshabilitar todas las comprobaciones de expresión de restricción estableciendo la variable check_constraint_checks en OFF. Esto es útil, por ejemplo, cuando se carga una tabla que viola algunas restricciones que desea encontrar y corregir más adelante en SQL.

Replicación

En la replicación basada en filas, solo el maestro comprueba las restricciones y las declaraciones fallidas no se replicarán. En la replicación basada en sentencias, los esclavos también comprobarán las restricciones. Por lo tanto, las restricciones deben ser idénticas, además de deterministas, en un entorno de replicación.

Autoincremento

MariaDB comenzando con 10.2.6

  • De MariaDB 10.2.6, las columnas auto_increment ya no se permiten en las restricciones de verificación. Anteriormente estaban permitidos, pero no funcionarían correctamente. Ver MDEV-11117.

Ejemplos de

CREATETABLE product (category INTNOTNULL, id INTNOTNULL,
                      price DECIMAL,PRIMARYKEY(category, id))ENGINE=INNODB;CREATETABLE customer (id INTNOTNULL,PRIMARYKEY(id))ENGINE=INNODB;CREATETABLE product_order (noINTNOTNULLAUTO_INCREMENT,
                            product_category INTNOTNULL,
                            product_id INTNOTNULL,
                            customer_id INTNOTNULL,PRIMARYKEY(no),INDEX(product_category, product_id),FOREIGNKEY(product_category, product_id)REFERENCES product(category, id)ONUPDATECASCADEONDELETERESTRICT,INDEX(customer_id),FOREIGNKEY(customer_id)REFERENCES customer(id))ENGINE=INNODB;

MariaDB comenzando con 10.2.1

Los siguientes ejemplos funcionarán a partir de MariaDB 10.2.1 adelante.

Restricciones numéricas y comparaciones:

CREATETABLE t1 (a INTCHECK(a>2), b INTCHECK(b>2),CONSTRAINT a_greater CHECK(a>b));INSERTINTO t1(a)VALUES(1);
ERROR 4022(23000): CONSTRAINT`a` failed for`test`.`t1`INSERTINTO t1(a,b)VALUES(3,4);
ERROR 4022(23000): CONSTRAINT`a_greater` failed for`test`.`t1`INSERTINTO t1(a,b)VALUES(4,3);
Query OK,1row affected (0.04 sec)

Eliminar una restricción:

ALTERTABLE t1 DROPCONSTRAINT a_greater;

Agregar una restricción:

ALTERTABLE t1 ADDCONSTRAINT a_greater CHECK(a>b);

Comparaciones de fechas y longitud de caracteres:

CREATETABLE t2 (name VARCHAR(30)CHECK(CHAR_LENGTH(name)>2), start_date DATE, 
  end_date DATECHECK(start_date ISNULLOR end_date ISNULLOR start_date<end_date));INSERTINTO t2(name, start_date, end_date)VALUES('Ione','2003-12-15','2014-11-09');
Query OK,1row affected (0.04 sec)INSERTINTO t2(name, start_date, end_date)VALUES('Io','2003-12-15','2014-11-09');
ERROR 4022(23000): CONSTRAINT`name` failed for`test`.`t2`INSERTINTO t2(name, start_date, end_date)VALUES('Ione',NULL,'2014-11-09');
Query OK,1row affected (0.04 sec)INSERTINTO t2(name, start_date, end_date)VALUES('Ione','2015-12-15','2014-11-09');
ERROR 4022(23000): CONSTRAINT`end_date` failed for`test`.`t2`

Un paréntesis mal colocado:

CREATETABLE t3 (name VARCHAR(30)CHECK(CHAR_LENGTH(name>2)), start_date DATE, 
  end_date DATECHECK(start_date ISNULLOR end_date ISNULLOR start_date<end_date));
Query OK,0rows affected (0.32 sec)INSERTINTO t3(name, start_date, end_date)VALUES('Io','2003-12-15','2014-11-09');
Query OK,1row affected,1 warning (0.04 sec)SHOWWARNINGS;+---------+------+----------------------------------------+|Level| Code | Message                                |+---------+------+----------------------------------------+| Warning |1292| Truncated incorrect DOUBLEvalue: 'Io'|+---------+------+----------------------------------------+

Compare la definición de tabla t2 a la mesa t3. CHAR_LENGTH(name)>2 es muy diferente a CHAR_LENGTH(name>2) ya que este último realiza por error una comparación numérica en el nombre campo, lo que lleva a resultados inesperados.

Ver también

  • Llaves extranjeras

El contenido reproducido en este sitio es propiedad de sus respectivos dueños, y MariaDB no revisa este contenido con anticipación. Los puntos de vista, la información y las opiniones expresadas por este contenido no representan necesariamente las de MariaDB o de cualquier otra parte.