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.