SQLite
 sql >> Datenbank >  >> RDS >> SQLite

SQLite - Erstellen Sie eine Beziehung

SQLite unterstützt Beziehungen wie jedes andere Verwaltungssystem für relationale Datenbanken.

SQLite ist ein relationales Datenbankverwaltungssystem (RDBMS). Es verwendet dasselbe relationale Modell wie andere beliebte DBMS (wie MySQL, Oracle, SQL Server, MS Access).

Das bedeutet, dass Sie mehrere Tabellen erstellen und diese dann über eine Beziehung miteinander verknüpfen können .

Eine Beziehung Hier haben Sie mehrere Tabellen, die verwandte Daten enthalten, und die Daten sind durch einen gemeinsamen Wert verknüpft, der in beiden Tabellen gespeichert ist.

Das folgende Diagramm veranschaulicht dieses Konzept:

Fügen wir also eine weitere Tabelle mit dem Namen Albums hinzu , dann lassen Sie das mit unseren Künstlern verknüpfen Tabelle über eine Beziehung.

Dadurch können wir nachschlagen, zu welchem ​​Künstler ein bestimmtes Album gehört.

Neue Tabelle erstellen

Machen wir also weiter und erstellen die Alben Tabelle:

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

Ähnlich wie bei der Erstellung der Künstler In dieser Tabelle haben wir jedoch FOREIGN KEY(ArtistId) REFERENCES Artists(ArtistId) hinzugefügt bis zum Ende der Anweisung.

Dadurch wird eine Fremdschlüsseleinschränkung für Albums.ArtistId erstellt Säule. Das bedeutet, dass alle Daten, die in diese Spalte eingefügt werden, mit einem Wert in Artists.ArtistId übereinstimmen müssen Spalte.

Wenn wir das nicht tun, wäre es möglich, ein Album zu haben, das keinem Künstler gehört. Mit anderen Worten, wir könnten verwaiste Datensätze in unserer Datenbank haben. Nicht gut, wenn Sie versuchen, die referenzielle Integrität aufrechtzuerhalten.

Wenn wir nun eine .tables ausführen Befehl, sollten wir beide Tabellen in der Datenbank sehen:

sqlite> .tables
Albums   Artists

Testen Sie die Beziehung

Nachdem wir die Tabelle mit dem Fremdschlüssel erstellt haben, können wir sie testen, indem wir versuchen, fehlerhafte Daten einzugeben. Wir können versuchen, ein Album mit einer ArtistId einzugeben die mit keiner ArtistId übereinstimmt in der referenzierten Tabelle (also die Artists Tabelle):

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

Dies sollte Folgendes ergeben:

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

Auch das Ausführen eines SELECT -Anweisung für die Tabelle gibt keine Daten zurück.

Dies liegt daran, dass die Fremdschlüsseleinschränkung das Einfügen des falschen Werts verhindert hat.

Hat nicht funktioniert?

Wenn Sie beim Versuch, solche fehlerhaften Daten einzugeben, keine Fehlermeldung erhalten, müssen Sie möglicherweise Ihre Einstellungen überprüfen.

Führen Sie den folgenden Befehl aus:PRAGMA foreign_keys;

Wenn dies zu 0 führt Dies bedeutet, dass Ihre Fremdschlüsselbeschränkungen deaktiviert sind. Tatsächlich ist dies das Standardverhalten von SQLite (es dient der Abwärtskompatibilität).

Um Fremdschlüsseleinschränkungen zu aktivieren, geben Sie Folgendes ein:PRAGMA foreign_keys = ON;

Führen Sie nun PRAGMA foreign_keys; aus sollte 1 zurückgeben , und nachfolgende Versuche, einen ungültigen Fremdschlüssel einzufügen, schlagen fehl.

Wenn jedoch die PRAGMA foreign_keys; Befehl keine Daten zurückgibt, unterstützt Ihre SQLite-Implementierung keine Fremdschlüssel (entweder weil sie älter als Version 3.6.19 ist oder weil sie mit SQLITE_OMIT_FOREIGN_KEY kompiliert wurde oder SQLITE_OMIT_TRIGGER definiert).

Weitere Daten einfügen

Nachdem die Beziehung hergestellt wurde, können wir so viele Daten wie nötig hinzufügen, in der Gewissheit, dass nur Datensätze mit gültigen Fremdschlüsseln eingefügt werden.

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

Als Nächstes wählen wir Daten aus beiden Tabellen mit einem JOIN aus Aussage.