Resumen :en este tutorial, aprenderá a usar SQLite CHECK
restricción para validar datos antes de insertar o actualizar.
Introducción a SQLite CHECK
restricciones
SQLite CHECK
las restricciones le permiten definir expresiones para probar valores cada vez que se insertan o actualizan dentro de una columna.
Si los valores no cumplen con los criterios definidos por la expresión, SQLite emitirá una violación de restricción y anulará la declaración.
El CHECK
las restricciones le permiten definir controles de integridad de datos adicionales más allá de UNIQUE
o NOT NULL
para adaptarse a su aplicación específica.
SQLite le permite definir un CHECK
restricción a nivel de columna o de tabla.
La siguiente declaración muestra cómo definir un CHECK
restricción a nivel de columna:
CREATE TABLE table_name(
...,
column_name data_type CHECK(expression),
...
);
Code language: SQL (Structured Query Language) (sql)
y la siguiente declaración ilustra cómo definir un CHECK
restricción a nivel de tabla:
CREATE TABLE table_name(
...,
CHECK(expression)
);
Code language: SQL (Structured Query Language) (sql)
En esta sintaxis, cada vez que se inserta una fila en una tabla o se actualiza una fila existente, la expresión asociada con cada CHECK
la restricción se evalúa y devuelve un valor numérico 0 o 1.
Si el resultado es cero, entonces ocurrió una violación de la restricción. Si el resultado es un valor distinto de cero o NULL, significa que no se produjo ninguna infracción de restricción.
Tenga en cuenta que la expresión de un CHECK
la restricción no puede contener una subconsulta.
SQLite CHECK
ejemplos de restricciones
Tomemos algunos ejemplos del uso de CHECK
restricciones.
1) Usando SQLite CHECK
restricción en el ejemplo de nivel de columna
La siguiente declaración crea una nueva tabla llamada contacts
:
CREATE TABLE contacts (
contact_id INTEGER PRIMARY KEY,
first_name TEXT NOT NULL,
last_name TEXT NOT NULL,
email TEXT,
phone TEXT NOT NULL
CHECK (length(phone) >= 10)
);
Code language: SQL (Structured Query Language) (sql)
En los contacts
mesa, el phone
la columna tiene un CHECK
restricción:
CHECK (length(phone) >= 10)
Code language: SQL (Structured Query Language) (sql)
Este CHECK
restricción asegura que los valores en el phone
la columna debe tener al menos 10 caracteres.
Si intenta ejecutar la siguiente declaración, obtendrá un error de violación de restricción:
INSERT INTO contacts(first_name, last_name, phone)
VALUES('John','Doe','408123456');
Code language: SQL (Structured Query Language) (sql)
Aquí está el mensaje de error:
Result: CHECK constraint failed: contacts
Code language: SQL (Structured Query Language) (sql)
La razón fue que el número de teléfono que intentó insertar solo tiene 9 caracteres, mientras que requiere al menos 10 caracteres.
La siguiente declaración debería funcionar porque el valor en el phone
columna tiene 13 caracteres, lo que satisface la expresión en CHECK
restricción:
INSERT INTO contacts(first_name, last_name, phone)
VALUES('John','Doe','(408)-123-456');
Code language: SQL (Structured Query Language) (sql)
2) Usando SQLite CHECK
ejemplo de restricciones a nivel de tabla
La siguiente declaración crea una nueva tabla llamada products
:
CREATE TABLE products (
product_id INTEGER PRIMARY KEY,
product_name TEXT NOT NULL,
list_price DECIMAL (10, 2) NOT NULL,
discount DECIMAL (10, 2) NOT NULL
DEFAULT 0,
CHECK (list_price >= discount AND
discount >= 0 AND
list_price >= 0)
);
Code language: SQL (Structured Query Language) (sql)
En este ejemplo, el CHECK
la restricción se define en el nivel de la tabla:
CHECK (list_price >= discount AND
discount >= 0 AND
list_price >= 0)
Code language: SQL (Structured Query Language) (sql)
El CHECK
La restricción garantiza que el precio de lista sea siempre mayor o igual que el descuento y que tanto el descuento como el precio de lista sean mayores o iguales a cero.
La siguiente declaración viola el CHECK
restricción porque el descuento es mayor que el precio de lista.
INSERT INTO products(product_name, list_price, discount)
VALUES('New Product',900,1000);
Code language: SQL (Structured Query Language) (sql)
La siguiente declaración también viola el CHECK
restricción porque el descuento es negativo:
INSERT INTO products(product_name, list_price, discount)
VALUES('New XFactor',1000,-10);
Code language: SQL (Structured Query Language) (sql)
Agregar CHECK
restricciones a una tabla existente
A partir de la versión 3.25.2, SQLite no admite agregar un CHECK
restricción a una tabla existente.
Sin embargo, puedes seguir estos pasos:
Primero, cree una nueva tabla cuya estructura sea la misma que la tabla a la que desea agregar un CHECK
restricción. La nueva tabla también debe incluir el CHECK
restricción:
CREATE TABLE new_table (
[...],
CHECK ([...])
);
Code language: SQL (Structured Query Language) (sql)
Para obtener la estructura de la tabla anterior, puede usar .schema
dominio. Consulte el tutorial de la tabla SQLite DESCRIBE para obtener más información.
En segundo lugar, copie los datos de la tabla anterior a la tabla nueva.
INSERT INTO new_table SELECT * FROM old_table;
Code language: SQL (Structured Query Language) (sql)
Tercero, suelte la tabla anterior:
DROP TABLE old_table;
Code language: SQL (Structured Query Language) (sql)
Cuarto, cambia el nombre de la nueva tabla a la anterior:
ALTER TABLE new_table RENAME TO old_table;
Code language: SQL (Structured Query Language) (sql)
Para que todas las declaraciones anteriores sean seguras para transacciones, debe ejecutarlas todas dentro de una transacción como esta:
BEGIN;
-- create a new table
CREATE TABLE new_table (
[...],
CHECK ([...])
);
-- copy data from old table to the new one
INSERT INTO new_table SELECT * FROM old_table;
-- drop the old table
DROP TABLE old_table;
-- rename new table to the old one
ALTER TABLE new_table RENAME TO old_table;
-- commit changes
COMMIT;
Code language: SQL (Structured Query Language) (sql)
En este tutorial, ha aprendido a usar SQLite CHECK
restricción para garantizar que los valores en una columna o un grupo de columnas satisfagan una condición definida por una expresión.