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

Encuentre violaciones de clave externa en SQLite

SQLite incluye una instrucción PRAGMA que le permite verificar si hay violaciones de claves externas en una base de datos completa o en una tabla determinada.

La declaración es PRAGMA foreign_key_check , y funciona de la siguiente manera.

Sintaxis

Puede usarlo de una de dos maneras:

PRAGMA schema.foreign_key_check;
PRAGMA schema.foreign_key_check(table-name);

La primera línea verifica toda la base de datos, mientras que la segunda solo verifica una tabla específica.

El schema opcional argumento especifica el nombre de una base de datos adjunta o principal o temperatura para las bases de datos principal y TEMP. Si schema se omite, principal se supone.

Ejemplo

Vamos a crear dos tablas con una relación entre ellas.

En este caso, las Mascotas la tabla tiene una clave externa que hace referencia al TypeId columna en Tipos mesa.

CREATE TABLE Types( 
    TypeId INTEGER PRIMARY KEY, 
    Type
);

CREATE TABLE Pets( 
    PetId INTEGER PRIMARY KEY, 
    PetName,
    TypeId,
    FOREIGN KEY(TypeId) REFERENCES Types(TypeId)
);

Ahora ingresemos datos que violen la restricción de clave externa.

PRAGMA foreign_keys = OFF;

INSERT INTO Types VALUES 
    ( 1, 'Dog' ),
    ( 2, 'Cat' );

INSERT INTO Pets VALUES 
    ( 1, 'Homer', 3 );

El segundo INSERT declaración viola la restricción de clave externa. Esto se debe a que inserta un valor de 3 en Pets.TypeId columna, cuando no hay un valor correspondiente en Types.TypeId columna.

Una cosa importante a tener en cuenta aquí es que deshabilité explícitamente las claves foráneas usando PRAGMA foreign_keys = OFF . Esta es la configuración predeterminada en SQLite, pero quería dejarlo claro para este ejemplo.

Ahora revisemos la base de datos en busca de violaciones de claves externas.

PRAGMA foreign_key_check;

Resultado:

table       rowid       parent      fkid      
----------  ----------  ----------  ----------
Pets        1           Types       0         

Esto nos dice que las Mascotas la tabla tiene una violación de clave externa en la fila con ROWID de 1. También nos dice el nombre de la tabla principal, así como la ID de clave externa.

Agreguemos más datos a las Mascotas tabla y vuelva a ejecutar la comprobación. Las dos primeras líneas se adhieren a la clave externa, pero la última línea no.

INSERT INTO Pets VALUES 
    ( NULL, 'Yelp', 1 ),
    ( NULL, 'Fluff', 2 ),
    ( NULL, 'Brush', 4 );

PRAGMA foreign_key_check;

Resultado:

table       rowid       parent      fkid      
----------  ----------  ----------  ----------
Pets        1           Types       0         
Pets        4           Types       0         

Ahora tenemos dos filas devueltas al verificar toda la base de datos en busca de violaciones de claves externas.

Consultar una tabla específica

También puede especificar una tabla para ejecutar la verificación.

Este es un ejemplo de cómo volver a escribir la verificación anterior para especificar solo las Mascotas. mesa.

PRAGMA foreign_key_check(Pets);

Resultado:

table       rowid       parent      fkid      
----------  ----------  ----------  ----------
Pets        1           Types       0         
Pets        4           Types       0         

Mismo resultado.

Aquí está el resultado si especifico la otra tabla.

PRAGMA foreign_key_check(Types);

Resultado:

 

(Está en blanco porque no hay resultados).

Especifique un esquema

Como se mencionó, también puede especificar el esquema.

PRAGMA main.foreign_key_check(Pets);

Resultado:

table       rowid       parent      fkid      
----------  ----------  ----------  ----------
Pets        1           Types       0         
Pets        4           Types       0         

En mi caso usé la base de datos principal, pero podrías reemplazar main con el nombre de su base de datos adjunta.

Cómo aplicar claves foráneas

Como se mencionó, SQLite no aplica claves foráneas a menos que especifique explícitamente que deben aplicarse.

Puede aplicar claves foráneas usando PRAGMA foreign_keys = ON .

Consulte Cómo habilitar la compatibilidad con claves externas en SQLite para obtener más información y ejemplos.