sql >> Database >  >> RDS >> SQLite

SQLite - Maak een relatie

SQLite ondersteunt relaties net als elk ander relationeel databasebeheersysteem.

SQLite is een relationele databasebeheersysteem (RDBMS). Het gebruikt hetzelfde relationele model dat andere populaire DBMS'en (zoals MySQL, Oracle, SQL Server, MS Access) gebruiken.

Wat dit betekent, is dat je meerdere tabellen kunt maken en ze vervolgens via een relatie aan elkaar kunt laten linken. .

Een relatie is waar u meerdere tabellen heeft die gerelateerde gegevens bevatten, en de gegevens zijn gekoppeld door een gemeenschappelijke waarde die in beide tabellen is opgeslagen.

Het volgende diagram illustreert dit concept:

Laten we dus nog een tabel toevoegen met de naam Albums , koppel dat dan aan onze Artiesten tafel via een relatie.

Door dit te doen, kunnen we opzoeken tot welke artiest een bepaald album behoort.

Maak de nieuwe tabel

Dus laten we doorgaan en de Albums . maken tafel:

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

Net als toen we de Artiesten . maakten tabel, maar aan deze hebben we FOREIGN KEY(ArtistId) REFERENCES Artists(ArtistId) toegevoegd aan het einde van de verklaring.

Dit creëert een externe sleutelbeperking op de Albums.ArtistId kolom. Dit betekent dat alle gegevens die in deze kolom worden ingevoegd, moeten overeenkomen met een waarde in de Artists.ArtistId kolom.

Als we dit niet zouden doen, zou het mogelijk zijn om een ​​album te hebben dat niet van een artiest is. Met andere woorden, we kunnen verweesde records in onze database hebben. Niet goed als je referentiële integriteit probeert te behouden.

Als we nu een .tables commando, zouden we beide tabellen in de database moeten zien:

sqlite> .tables
Albums   Artists

Test de relatie

Zodra we de tabel met de externe sleutel hebben gemaakt, kunnen we deze testen door te proberen foutieve gegevens in te voeren. We kunnen proberen een album in te voeren met een ArtistId die niet overeenkomt met een ArtistId in de tabel waarnaar wordt verwezen (d.w.z. de Artiesten tabel):

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

Dit zou moeten resulteren in het volgende:

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

Ook het uitvoeren van een SELECT statement op de tafel zal geen data teruggeven.

Dit komt omdat de externe-sleutelbeperking de invoer van de verkeerde waarde blokkeerde.

Werkte niet?

Als u geen foutmelding krijgt wanneer u op deze manier onjuiste gegevens probeert in te voeren, moet u mogelijk uw instellingen controleren.

Voer de volgende opdracht uit:PRAGMA foreign_keys;

Als dit resulteert in 0 het betekent dat uw externe sleutelbeperkingen zijn uitgeschakeld. In feite is dit het standaardgedrag van SQLite (het is voor achterwaartse compatibiliteit).

Om beperkingen voor externe sleutels in te schakelen, typt u het volgende PRAGMA foreign_keys = ON;

Nu draait PRAGMA foreign_keys; moet 1 teruggeven , en daaropvolgende pogingen om een ​​ongeldige externe sleutel in te voeren zullen mislukken.

Als de PRAGMA foreign_keys; commando retourneert geen gegevens, uw SQLite-implementatie ondersteunt geen externe sleutels (ofwel omdat het ouder is dan versie 3.6.19 of omdat het is gecompileerd met SQLITE_OMIT_FOREIGN_KEY of SQLITE_OMIT_TRIGGER gedefinieerd).

Voeg meer gegevens in

Nu de relatie tot stand is gebracht, kunnen we zoveel gegevens toevoegen als we nodig hebben, in het vertrouwen dat alleen records met geldige externe sleutels worden ingevoegd.

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

Vervolgens selecteren we gegevens uit beide tabellen met een JOIN verklaring.


  1. Getallen opmaken in MySQL

  2. SQL OR-operator voor beginners

  3. Verbindingstime-out instellen in SQLAlchemy

  4. 8 functies om de dag te retourneren vanaf een datum in MariaDB