2010-06-11 4 views
8

Pourquoi la contrainte de clé étrangère suivante (bien qu'elle s'exécute correctement) n'est pas appliquée par SQLite? Comment puis-je aller à l'application de la relation?La clé étrangère n'est pas appliquée

CREATE TABLE User (
    UserID TEXT Unique NOT NULL PRIMARY KEY, 
    FirstName TEXT NOT NULL, 
    LastName TEXT NOT NULL, 
    Username TEXT NOT NULL, 
    Password TEXT NOT NULL, 
    Email TEXT NOT NULL, 
    SignupDate TEXT NOT NULL 
) 

CREATE TABLE Category (
    CategoryID TEXT Unique NOT NULL PRIMARY KEY, 
    UserID TEXT, 
    FOREIGN KEY(UserID) REFERENCES User(UserID) 
) 

Répondre

12

Comme the relevant docs disent (dans la section 2. Activation du support clé étrangère):

Assuming the library is compiled with foreign key constraints enabled, it must still be enabled by the application at runtime, using the PRAGMA foreign_keys command. For example:

sqlite> PRAGMA foreign_keys = ON;

Foreign key constraints are disabled by default (for backwards compatibility), so must be enabled separately for each database connection separately.

Avez-vous utilisé que PRAGMA dans la connexion pertinente? (En supposant, comme le disent les docs, que sqlite soit compilé de manière appropriée, et aussi une version assez récente pour offrir l'application de contraintes de clés étrangères, bien sûr).

+0

Merci beaucoup pour la réponse rapide. Je n'ai jamais remarqué ça dans la documentation (ça va paraître plus dur la prochaine fois). Ayant juste essayé d'exécuter cette commande je reçois l'erreur suivante: "SQLite prepare() a échoué ERREUR: autorisation refusée DETAILS: non autorisé EXPRESSION: PRAGMA foreign_keys = ON;" Je suppose que soit la version qu'ils utilisent ne supporte pas ou a eu la fonctionnalité désactivée. Puis-je créer le même résultat final à l'aide de déclencheurs? Si oui, quelqu'un pourrait-il fournir un exemple de syntaxe de déclenchement pour SQLITE? –

+0

@Maxim, je crois que les déclencheurs de clés étrangères sqlite requièrent exactement les mêmes fonctionnalités sous-jacentes que les anciennes clés étrangères (souvent supprimées dans les builds intégrées de sqlite qui veulent être plus petites et plus rapides qu'elles ne veulent offrir une "puissance ACID relationnelle" complète). coûts substantiels de performance et d'encombrement). –

3

Vous pouvez également activer le support de clé étrangère via l'intégration dans connectionstring:

foreign keys=True 

Exemple:

"Data Source={DatabaseFullFilePath};Version=3;foreign keys=True;datetimeformat=CurrentCulture" 
Questions connexes