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

Crear una clave externa en SQLite

Cuando crea una tabla en SQLite, también puede crear una clave externa para establecer una relación con otra tabla.

Este artículo proporciona un ejemplo de cómo crear una clave externa al crear una tabla en SQLite.

Habilitar compatibilidad con clave externa

Lo primero que debemos hacer es habilitar el soporte de clave externa (si aún no se ha hecho).

Asumiendo que su biblioteca SQLite no lo ha hecho sido compilado con SQLITE_OMIT_FOREIGN_KEY o SQLITE_OMIT_TRIGGER definido, aún necesitará habilitar el soporte de clave externa en tiempo de ejecución.

Para hacer esto, ejecute la siguiente instrucción:

PRAGMA foreign_keys = ON;

Esto habilitará la aplicación de claves foráneas para su conexión de base de datos.

Si abre otra conexión, deberá ejecutar la misma instrucción para esa conexión.

Tenga en cuenta que esta configuración no es necesaria para crear claves foráneas, pero es necesario para hacer cumplir claves foráneas.

Ahora que hemos habilitado la compatibilidad con claves externas, sigamos adelante y creemos una clave externa.

Ejemplo

Imagina que queremos dos tablas con los siguientes datos.

Mesa llamada Mascotas :

PetId       PetName     TypeId    
----------  ----------  ----------
1           Brush       3         
2           Tweet       3         
3           Yelp        1         
4           Woofer      1         
5           Fluff       2         

Tabla llamada Tipo s:

TypeId      Type      
----------  ----------
1           Dog       
2           Cat       
3           Parakeet  
4           Hamster   

Y queremos el TypeId columna de Mascotas tabla para hacer referencia al TypeId columna de los Tipos mesa.

En otras palabras, queremos hacer Pets.TypeId la clave secundaria (con una restricción de clave externa) y Types.TypeId la clave principal (con una restricción de clave principal).

Si bien las claves principales suelen ser también la clave principal de la tabla, esto no es realmente un requisito. En este ejemplo, la convertiremos en la clave principal.

Podemos usar el siguiente código para crear estas dos tablas.

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

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

La parte que crea la clave foránea es esta:

FOREIGN KEY(TypeId) REFERENCES Types(TypeId)

La FOREIGN KEY(TypeId) parte declara Pets.TypeId como clave foránea.

Aunque no califiqué el nombre de la columna con su nombre de tabla, sabemos que es Pets.TypeId (y no Types.TypeId ) porque estamos ejecutando esto en CREATE TABLE declaración para mascotas .

Los REFERENCES Types(TypeId) especifica la columna a la que hará referencia nuestra clave externa. En este caso, hará referencia al TypeId columna de los Tipos mesa.

Ahora que nuestras tablas se han creado con la clave externa adecuada, podemos agregar datos.

INSERT INTO Types VALUES 
    ( NULL, 'Dog' ),
    ( NULL, 'Cat' ),
    ( NULL, 'Parakeet' ),
    ( NULL, 'Hamster' );

INSERT INTO Pets VALUES 
    ( NULL, 'Brush', 3 ),
    ( NULL, 'Tweet', 3 ),
    ( NULL, 'Yelp', 1 ),
    ( NULL, 'Woofer', 1 ),
    ( NULL, 'Fluff', 2 );

Las tablas ahora contienen los datos que se muestran arriba.

sqlite> SELECT * FROM Pets;
PetId       PetName     TypeId    
----------  ----------  ----------
1           Brush       3         
2           Tweet       3         
3           Yelp        1         
4           Woofer      1         
5           Fluff       2         
sqlite> SELECT * FROM Types;
TypeId      Type      
----------  ----------
1           Dog       
2           Cat       
3           Parakeet  
4           Hamster   

Violación de clave externa

Pero ahora intentemos insertar datos que violen la clave externa.

Intentemos agregar una mascota que use un TypeID inexistente (es decir, un TypeId valor que no existe en los Tipos columna).

INSERT INTO Pets VALUES 
    ( NULL, 'Homer', 5 );

Resultado:

Error: FOREIGN KEY constraint failed

Entonces, nuestra clave externa evitó con éxito que datos incorrectos ingresaran a la base de datos. Por lo tanto, nos ayudó a mantener la integridad de los datos.

Si no recibe este error y los datos se insertaron correctamente, no ha habilitado la compatibilidad con claves externas. Como se mencionó, deberá habilitar la compatibilidad con claves externas antes de que se apliquen sus claves externas.

Agregar una clave externa a una tabla existente

La ALTER TABLE La declaración en SQLite es muy limitada y no permite agregar una clave externa a una tabla existente.

Por lo tanto, si necesita agregar una clave externa a una tabla existente, deberá eliminar la tabla y crearla nuevamente con la restricción de clave externa.

Si la tabla contiene datos que desea conservar, puede transferir esos datos a otra tabla antes de volver a transferirlos una vez que haya creado la nueva tabla con la restricción de clave externa.