sql >> Base de Datos >  >> RDS >> SQLite

Restricciones de SQLite CHECK

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.