web-dev-qa-db-fra.com

Clé étrangère SQLite

Je suis les instructions de la documentation SQLite à http://www.sqlite.org/foreignkeys.html mais ma tentative d’ajout d’une clé étrangère a échoué. Voici mes déclarations de création:

CREATE TABLE 
    checklist (
        _id INTEGER PRIMARY KEY AUTOINCREMENT, 
        checklist_title TEXT,
        description TEXT,
        created_on INTEGER, 
        modified_on INTEGER
    );

CREATE TABLE 
    item (
        _id INTEGER PRIMARY KEY AUTOINCREMENT,  
        FOREIGN KEY(checklist_id) REFERENCES checklist(_id), 
        item_text TEXT, item_hint TEXT, 
        item_order INTEGER, 
        created_on INTEGER, 
        modified_on INTEGER
    );

La première table est faite bien. L'erreur se produit dans la deuxième instruction. J'ai essayé les deux avec emballer les deux requêtes dans une transaction et sans. Voici l'erreur:

colonne inconnue "checklist_id" dans la définition de clé étrangère (code 1):, lors de la compilation: élément CREATE TABLE (_id INTEGER, CLÉ PRIMAIRE AUTOINCREMENT, FOREIGN KEY (checklist_id). , modified_on INTEGER)

39
Geeks On Hugs

Vous devez toujours créer la colonne checklist_id INTEGER avant de l'ajouter en tant que clé étrangère.

Donc ce serait:

CREATE TABLE 
    checklist (
        _id INTEGER PRIMARY KEY AUTOINCREMENT, 
        checklist_title TEXT,
        description TEXT,
        created_on INTEGER, 
        modified_on INTEGER
    );

CREATE TABLE 
    item (
        _id INTEGER PRIMARY KEY AUTOINCREMENT,  
        checklist_id INTEGER,
        item_text TEXT, 
        item_hint TEXT, 
        item_order INTEGER, 
        created_on INTEGER, 
        modified_on INTEGER,
        FOREIGN KEY(checklist_id) REFERENCES checklist(_id)
    );
73
Scen

Il vous manque simplement la colonne checklist_id dans votre item table. Vous devez le déclarer avant de le définir en tant que FOREIGN KEY. Vous avez essayé de créer FK sur une colonne inexistante et cela explique pourquoi cela ne fonctionne pas.

Donc, vous devez ajouter ceci:

checklist_id INTEGER,
FOREIGN KEY(checklist_id) REFERENCES checklist(_id)

maintenant ça devrait marcher.

4
Simon Dorociak

Vous devez inclure le nom de la colonne avant de l’envelopper avec FOREIGN KEY ().

CREATE TABLE 
    item (
        _id INTEGER PRIMARY KEY AUTOINCREMENT,  
        checklist_id INTEGER,
        FOREIGN KEY(checklist_id) REFERENCES checklist(_id), 
        item_text TEXT, item_hint TEXT, 
        item_order INTEGER, 
        created_on INTEGER, 
        modified_on INTEGER
    );
3
lorraine

Placez la définition FOREIGN KEY à la fin de l'instruction SQL

2
rudakovsky

Je pense que les réponses ci-dessus ne sont pas tout à fait correctes, ou du moins légèrement trompeuses . Comme ils l'ont correctement souligné, vous pouvez créer la colonne, puis ajouter une contrainte de clé étrangère sur une ligne distincte. Cela s'appelle spécifier une contrainte de table.

Mais il existe aussi une syntaxe plus courte, lorsque vous n'appliquez que sur 1 colonne, les 4 contraintes possibles (PRIMARY KEY, UNIQUE, CHECK, FOREIGN KEY) peuvent également être spécifiées inline (comme NOT NULL, par exemple), en tant que contrainte de colonne. C'est à dire. tu peux écrire:

CREATE TABLE 
item (
    _id INTEGER PRIMARY KEY AUTOINCREMENT,  
    checklist_id REFERENCES checklist(_id), 
    item_text TEXT, item_hint TEXT, 
    item_order INTEGER, 
    created_on INTEGER, 
    modified_on INTEGER
);

En passant, si vous avez des doutes sur la syntaxe, la documentation officielle contient vraiment de jolis diagrammes ferroviaires.

0
szmate1618