web-dev-qa-db-fra.com

Syntaxe SQLite pour créer une table avec une clé étrangère

Je crée une table avec des références de clés étrangères. Je m'interroge sur la syntaxe requise. Généralement, j'ai vu ce qui suit (de http://www.sqlite.org/foreignkeys.html#fk_basics ):

CREATE TABLE artist(  
  artistid    INTEGER PRIMARY KEY,  
  artistname  TEXT  
);  
CREATE TABLE track(  
  trackid     INTEGER,   
  trackname   TEXT,  
  trackartist INTEGER,  
  FOREIGN KEY(trackartist) REFERENCES artist(artistid)  
);

Cependant, sur le même site ( http://www.sqlite.org/foreignkeys.html#fk_actions ) je vois ceci:

CREATE TABLE artist(  
  artistid    INTEGER PRIMARY KEY,  
  artistname  TEXT  
);  
CREATE TABLE track(  
  trackid     INTEGER,  
  trackname   TEXT,   
  trackartist INTEGER REFERENCES artist(artistid) ON UPDATE CASCADE  
);

Cette dernière syntaxe est un peu plus concise, mais je veux savoir si le résultat est en quelque sorte différent (à part le ON UPDATE CASCADE, ce qui a bien sûr un effet; Je ne l'ai inclus que parce que j'ai copié le code exactement à partir du site référencé et parce que je ne sais pas que la syntaxe ci-dessus ne s'applique pas uniquement lors de la création d'une telle spécification). Je travaille sur Android, au cas où cela compte.

41
hBrent

Voir diagrammes de syntaxe .

La première syntaxe est une contrainte de table , tandis que la deuxième syntaxe est une contrainte de colonne . Dans ces exemples, ils se comportent de la même manière.

Vous auriez besoin d'une contrainte de table pour une clé sur plusieurs colonnes (où vous n'avez pas une seule colonne à laquelle vous pouvez la joindre).

23
CL.

Cette réponse n'est peut-être pas liée à la vôtre, mais j'ai pensé qu'elle devrait être utile pour les autres utilisateurs de la base de données Android.
IN SQLite Les contraintes de clé étrangère sont désactivées par défaut (pour une compatibilité descendante). Vous devez l'activer explicitement en utilisant

PRAGMA foreign_keys = 1

après avoir établi votre connexion avec la base de données. Voici le lien vers les documents officiels qui l'expliquent plus en détail. http://sqlite.org/foreignkeys.html Veuillez naviguer pour activer la prise en charge des clés étrangères dans le lien ci-dessus.

32
war_Hero