SQLite
 sql >> Database >  >> RDS >> SQLite

SQLite - Crea una relazione

SQLite supporta le relazioni proprio come qualsiasi altro sistema di gestione di database relazionali.

SQLite è un relazionale sistema di gestione di database (RDBMS). Utilizza lo stesso modello relazionale utilizzato da altri popolari DBMS (come MySQL, Oracle, SQL Server, MS Access).

Ciò significa che puoi creare più tabelle, quindi collegarle tra loro tramite una relazione .

Una relazione è dove hai più tabelle che contengono dati correlati e i dati sono collegati da un valore comune memorizzato in entrambe le tabelle.

Il diagramma seguente illustra questo concetto:

Quindi, aggiungiamo un'altra tabella chiamata Albums , quindi collegalo ai nostri Artisti tabella tramite una relazione.

In questo modo potremo cercare a quale artista appartiene un determinato album.

Crea la nuova tabella

Quindi andiamo avanti e creiamo gli Album tabella:

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)
);

Simile a quando abbiamo creato gli Artisti tabella, tuttavia, su questa abbiamo aggiunto FOREIGN KEY(ArtistId) REFERENCES Artists(ArtistId) alla fine della dichiarazione.

Questo crea un vincolo di chiave esterna su Albums.ArtistId colonna. Ciò significa che tutti i dati inseriti in questa colonna devono corrispondere a un valore in Artists.ArtistId colonna.

Se non lo facessimo, sarebbe possibile avere un album che non appartiene a un artista. In altre parole, potremmo avere record orfani nel nostro database. Non va bene se stai cercando di mantenere l'integrità referenziale.

Ora, se eseguiamo un .tables comando, dovremmo vedere entrambe le tabelle nel database:

sqlite> .tables
Albums   Artists

Verifica la relazione

Una volta creata la tabella con la chiave esterna, possiamo testarla tentando di inserire dati errati. Possiamo provare a inserire un album con un ArtistId che non corrisponde a un ArtistId nella tabella di riferimento (ovvero gli Artisti tabella):

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

Ciò dovrebbe comportare quanto segue:

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

Inoltre, eseguendo un SELECT l'istruzione sulla tabella non restituirà dati.

Ciò è dovuto al fatto che il vincolo di chiave esterna ha impedito l'inserimento di un valore errato.

Non ha funzionato?

Se non ricevi un messaggio di errore quando tenti di inserire dati errati come questo, potresti dover controllare le tue impostazioni.

Esegui il seguente comando:PRAGMA foreign_keys;

Se questo risulta in 0 significa che i tuoi vincoli di chiave esterna sono disabilitati. In effetti, questo è il comportamento predefinito di SQLite (è per la compatibilità con le versioni precedenti).

Per abilitare i vincoli di chiave esterna, digita il seguente PRAGMA foreign_keys = ON;

Ora, eseguendo PRAGMA foreign_keys; dovrebbe restituire 1 e i successivi tentativi di inserimento di una chiave esterna non valida avranno esito negativo.

Tuttavia, se il PRAGMA foreign_keys; comando non restituisce dati, la tua implementazione SQLite non supporta chiavi esterne (o perché è precedente alla versione 3.6.19 o perché è stata compilata con SQLITE_OMIT_FOREIGN_KEY o SQLITE_OMIT_TRIGGER definito).

Inserisci più dati

Ora che la relazione è stata stabilita, possiamo aggiungere tutti i dati di cui abbiamo bisogno, con la certezza che verranno inseriti solo record con chiavi esterne valide.

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);

Successivamente, selezioneremo i dati da entrambe le tabelle utilizzando un JOIN dichiarazione.