2017-06-07 29 views
0

En utilisant SQLite3 avec le schéma suivant:sortie de foreign_key_list de pragma du SQLite

CREATE TABLE Customers(ID INTEGER PRIMARY KEY, Company TEXT NOT NULL UNIQUE, Country TEXT NOT NULL, City TEXT NOT NULL); 
CREATE TABLE Orders(ID INTEGER PRIMARY KEY, CustomerID INTEGER NOT NULL, FOREIGN KEY(CustomerID) REFERENCES Customers(ID) ON DELETE RESTRICT ON UPDATE RESTRICT); 

et cette commande:

PRAGMA foreign_key_list(Orders); 

résultats dans la sortie suivante:

0|0|Customers|CustomerID|ID|RESTRICT|RESTRICT|NONE 

Comme le documentation ne dit rien sur le sens de la sortie de ce pragma, en dehors de l'évidence (clients - Table des parents, CustomerID - clé enfant, ID - clé parent, RESTREINT - ON SUPPRIMER et le second RESTREINT - ON UPDATE) Je présume que AUCUN coresponds à la clause MATCH non prise en charge.

La chose que je ne peux pas comprendre par moi-même est la signification des deux premiers zéros. Quelqu'un pourrait-il me dire ce que c'est?

+0

Les deux premiers sont 'id' et' seq'. 'id' représente un identifiant unique pour une clé étrangère dans une table. S'il y a plusieurs clés étrangères, 'id' sera 0, 1, ... – kuro

+0

' seq' est le numéro de séquence de la colonne pour la clé. Il est utilisé pour muti colonne clé étrangère – kuro

+0

@kuro S'il vous plaît écrivez cela comme une réponse. –

Répondre

1

La sortie de PRAGMA foreign_key_list() se compose de colonnes suivantes dans l'ordre -

id, seq, table, from, to, on_update, on_delete, match

Ainsi, dans la sortie que vous obtenez les deux premiers 0 s sont pour id et seq.

Prenez exemple ci-dessous exécuté en cli sqlite3 avec en-tête et de l'option de colonne -

CREATE TABLE Test (first INTEGER, second INTEGER, FOREIGN KEY (first) REFERENCES A(a) ON DELETE CASCADE, FOREIGN KEY (second) REFERENCES B(x) ON DELETE CASCADE); 
sqlite> 
sqlite> PRAGMA foreign_key_list(Test); 
id   seq   table  from  to   on_update on_delete match  
---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- 
0   0   B   second  x   NO ACTION CASCADE  NONE  
1   0   A   first  a   NO ACTION CASCADE  NONE 

Je sais la table Test ressembler à un cauchemar, mais simplement ignorer le schéma horrible pour un moment.

Vous pouvez voir qu'il y a deux clés étrangères dans la table Test et donc il y a deux entrées montrées dans la sortie PRAGMA foreign_key_list(). Vous pouvez voir la valeur id des champs sont 0 et 1 respectivement, mais les valeurs sont toutes seq 0.

Comme vous le savez peut-sqlite permet plusieurs noms de colonnes dans la déclaration clé étrangère. Donc, si vous prenez l'exemple suivant -

sqlite> CREATE TABLE Test2 (first INTEGER, second INTEGER, FOREIGN KEY (first, second) REFERENCES A(a, b) ON DELETE CASCADE); 
sqlite> 
sqlite> PRAGMA foreign_key_list(Test2); 
id   seq   table  from  to   on_update on_delete match  
---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- 
0   0   A   first  a   NO ACTION CASCADE  NONE  
0   1   A   second  b   NO ACTION CASCADE  NONE 

Ainsi, les multiples colonnes clés entraîne plusieurs lignes dans la sortie où id est la même que c'est en fait une clé. Mais la valeur seq diffère car il y a plusieurs colonnes dans la clé.

+0

Parfait! Merci une fois de plus! – scopchanov

+1

Vous êtes les bienvenus – kuro