Una restricción de verificación es un tipo de restricción de integridad en SQL que especifica un requisito que debe cumplir cada fila en una tabla de base de datos . La restricción debe ser un predicado . Puede referirse a una sola columna o a varias columnas de la tabla. El resultado del predicado puede ser verdadero TRUE, FALSEfalso o UNKNOWNfalso, dependiendo de la presencia de valores NULL . Si el predicado se evalúa como verdadero UNKNOWN, la restricción no se viola y la fila se puede insertar o actualizar en la tabla. Esto es contrario a los predicados en WHERElas cláusulas de las sentencias `in` SELECTo UPDATE`in`.
Por ejemplo, en una tabla que contiene productos, se podría agregar una restricción de verificación de tal manera que el precio de un producto y la cantidad de un producto sean valores no negativos:
precio >= 0
cantidad >= 0
Si no existieran estas restricciones, sería posible tener un precio negativo (−$30) o una cantidad negativa (−3 artículos).
Las restricciones de verificación se utilizan para garantizar la validez de los datos en una base de datos y proporcionar integridad de los datos . Si se utilizan a nivel de base de datos, las aplicaciones que la utilizan no podrán agregar datos no válidos ni modificar datos válidos de forma que estos se vuelvan inválidos, incluso si la propia aplicación acepta datos no válidos.
Definición
Cada restricción de verificación debe definirse en la instrucción CREATE TABLEOR utilizando la siguiente sintaxis:ALTER TABLE
CREAR TABLA nombre_tabla ( ..., RESTRICCIÓN nombre_de_restricción VERIFICAR ( predicado ), ... )
ALTER TABLE table_name ADD CONSTRAINT constraint_name CHECK ( predicate )
Si la restricción de verificación se refiere a una sola columna, es posible especificar la restricción como parte de la definición de la columna.
CREAR TABLA nombre_tabla ( ... tipo column_name CHECK ( predicado ), ... )
restricción NOT NULL
Una restricción es funcionalmente equivalente a la siguiente restricción de verificación con un predicado:NOT NULLIS NOT NULL
VERIFICAR ( la columna NO ES NULA)
Algunos sistemas de gestión de bases de datos relacionales pueden optimizar el rendimiento cuando NOT NULLse utiliza la sintaxis de restricciones en lugar de la CHECKsintaxis de restricciones dada anteriormente. [ 1 ]
Restricciones comunes
La mayoría de los sistemas de gestión de bases de datos restringen las restricciones de verificación a una sola fila, con acceso a constantes y funciones deterministas, pero no a datos en otras tablas, o a datos invisibles para la transacción actual debido al aislamiento de transacciones .
Estas restricciones no son realmente restricciones de verificación de tabla, sino más bien restricciones de verificación de fila . Dado que estas restricciones generalmente solo se verifican cuando se actualiza directamente una fila (por razones de rendimiento) y a menudo se implementan como implícitas INSERTo UPDATEdesencadenantes, las restricciones de integridad podrían violarse mediante acciones indirectas si no fuera por estas limitaciones. Además, las modificaciones que de otro modo serían válidas en estos registros se verían impedidas por la CHECKrestricción. Algunos ejemplos de restricciones peligrosas incluyen:
CHECK((selectcount(*)frominvoiceswhereinvoices.customerId=customerId)<1000)CHECK(dateInserted=CURRENT_DATE)CHECK(countItems=RAND())
Se pueden usar disparadores definidos por el usuario para sortear estas restricciones. Si bien su implementación es similar, semánticamente queda claro que los disparadores solo se activarán cuando la tabla se modifique directamente, y que es responsabilidad del diseñador gestionar los cambios indirectos e importantes en otras tablas; por otro lado, las restricciones están diseñadas para ser "verdaderas en todo momento", independientemente de las acciones del usuario o de la falta de previsión del diseñador.
Referencias
- ↑ Documentación de PostgreSQL 13, Capítulo 5. Definición de datos , Sección 5.4.2. Restricciones de no nulidad , Sitio web: https://www.postgresql.org/docs/13/ddl-constraints.html , Consultado el 9 de enero de 2021
- SQL
