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

SQLite - Crear una relación

SQLite admite relaciones como cualquier otro sistema de administración de bases de datos relacionales.

SQLite es un relacional sistema de gestión de base de datos (RDBMS). Utiliza el mismo modelo relacional que utilizan otros DBMS populares (como MySQL, Oracle, SQL Server, MS Access).

Lo que esto significa es que puede crear varias tablas y luego hacer que se vinculen entre sí a través de una relación .

Una relación es donde tiene varias tablas que contienen datos relacionados y los datos están vinculados por un valor común que se almacena en ambas tablas.

El siguiente diagrama ilustra este concepto:

Entonces, agreguemos otra tabla llamada Albums , luego vincúlelo a nuestros Artistas tabla a través de una relación.

Hacer esto nos permitirá buscar a qué artista pertenece un álbum determinado.

Crear la nueva tabla

Así que sigamos adelante y creemos los Álbumes tabla:

CREATE TABLE Albums(
  AlbumId     INTEGER PRIMARY KEY, 
  AlbumName   TEXT NOT NULL,
  Year        TEXT NOT NULL,
  ArtistId INTEGER NOT NULL,
  FOREIGN KEY(ArtistId) REFERENCES Artists(ArtistId)
);

Similar a cuando creamos los Artistas tabla, sin embargo, en esta hemos agregado FOREIGN KEY(ArtistId) REFERENCES Artists(ArtistId) hasta el final de la declaración.

Esto crea una restricción de clave externa en Albums.ArtistId columna. Lo que esto significa es que cualquier dato que se inserte en esta columna debe coincidir con un valor en Artists.ArtistId columna.

Si no hiciéramos esto, sería posible tener un álbum que no pertenezca a un artista. En otras palabras, podríamos tener registros huérfanos en nuestra base de datos. No es bueno si intenta mantener la integridad referencial.

Ahora, si ejecutamos un .tables comando, deberíamos ver ambas tablas en la base de datos:

sqlite> .tables
Albums   Artists

Prueba la relación

Una vez que hemos creado la tabla con la clave externa, podemos probarla intentando ingresar datos erróneos. Podemos intentar ingresar un álbum con un ArtistId que no coincide con un ArtistId en la tabla de referencia (es decir, los Artistas tabla):

INSERT INTO Albums (AlbumName, Year, ArtistId)
VALUES ('Powerslave', '1984', 70);

Esto debería resultar en lo siguiente:

sqlite> INSERT INTO Albums (AlbumName, Year, ArtistId)
   ...> VALUES ('Powerslave', '1984', 70);
Error: FOREIGN KEY constraint failed

Además, ejecutando un SELECT declaración en la tabla no devolverá datos.

Esto se debe a que la restricción de clave externa bloqueó la inserción del valor incorrecto.

¿No funcionó?

Si no recibe un error al intentar ingresar datos erróneos como este, es posible que deba verificar su configuración.

Ejecute el siguiente comando:PRAGMA foreign_keys;

Si esto da como resultado 0 significa que sus restricciones de clave externa están deshabilitadas. De hecho, este es el comportamiento predeterminado de SQLite (es para compatibilidad con versiones anteriores).

Para habilitar las restricciones de clave externa, escriba lo siguiente PRAGMA foreign_keys = ON;

Ahora, ejecutando PRAGMA foreign_keys; debe devolver 1 , y los intentos posteriores de insertar una clave externa no válida fallarán.

Sin embargo, si PRAGMA foreign_keys; El comando no devuelve datos, su implementación de SQLite no admite claves externas (ya sea porque es anterior a la versión 3.6.19 o porque se compiló con SQLITE_OMIT_FOREIGN_KEY o SQLITE_OMIT_TRIGGER definido).

Insertar más datos

Ahora que se ha establecido la relación, podemos agregar tantos datos como necesitemos, con la confianza de que solo se insertarán registros con claves externas válidas.

INSERT INTO Albums VALUES (NULL, 'Killers', '1981', 7);
INSERT INTO Albums VALUES (NULL, 'Powerslave', '1984', 7);
INSERT INTO Albums VALUES (NULL, 'Surfing with the Alien', '1987', 1);
INSERT INTO Albums VALUES (NULL, 'Heavy as a Really Heavy Thing', '1995', 11);
INSERT INTO Albums VALUES (NULL, 'Yummy Yummy', '1994', 17);
INSERT INTO Albums VALUES (NULL, 'Out of the Loop', '2007', 6);
INSERT INTO Albums VALUES (NULL, 'Suck on This', '1989', 13);
INSERT INTO Albums VALUES (NULL, 'Pork Soda', '1993', 13);
INSERT INTO Albums VALUES (NULL, 'Sailing the Seas of Cheese', '1991', 13);
INSERT INTO Albums VALUES (NULL, 'Flying in a Blue Dream', '1989', 1);
INSERT INTO Albums VALUES (NULL, 'Black Swans and Wormhole Wizards', '2010', 1);
INSERT INTO Albums VALUES (NULL, 'Somewhere in Time', '1986', 7);
INSERT INTO Albums VALUES (NULL, 'Big Red Car', '1995', 17);

A continuación, seleccionaremos datos de ambas tablas usando JOIN declaración.