2010-06-11 14 views
8

Perché il seguente vincolo di chiave esterna (sebbene eseguito correttamente) non viene applicato da SQLite? Come posso fare per far rispettare la relazione?La chiave esterna non viene applicata

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

risposta

12

Come the relevant docs dicono (nella sezione 2. Abilitazione degli Esteri Supporto chiave):

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.

Hai usato che PRAGMA nella connessione rilevante? (Supponendo, come dicono i documenti, che sqlite sia compilato in modo appropriato, e anche una versione abbastanza recente per offrire l'applicazione del vincolo di chiave esterna, ovviamente).

+0

Grazie mille per la pronta risposta. Non l'ho mai notato nella documentazione (sembrerà più difficile la prossima volta). Avendo appena tentato di eseguire tale comando, ricevo il seguente errore: "SQLite prepare() non riuscito ERRORE: autorizzazione negata DETTAGLI: non autorizzato ESPRESSIONE: PRAGMA foreign_keys = ON;" Sto assumendo che la versione che stanno utilizzando non la supporti o abbia disabilitato la funzionalità. Posso creare lo stesso risultato finale utilizzando i trigger? In tal caso, chiunque potrebbe fornire qualche esempio di sintassi del trigger per SQLITE? –

+0

@Maxim, credo che i trigger di chiave esterna sqlite richiedano esattamente la stessa funzionalità di base delle normali chiavi esterne (spesso rimosse in build incorporate di sqlite che vogliono essere piccole e veloci più di quanto vogliano offrire "piena potenza ACID relazionale" a notevoli costi di prestazioni e di ingombro). –

3

È anche possibile attivare il supporto chiave esterna tramite embedding in connectionstring:

foreign keys=True 

Esempio:

"Data Source={DatabaseFullFilePath};Version=3;foreign keys=True;datetimeformat=CurrentCulture" 
Problemi correlati