2013-03-08 21 views
10

Sto usando Ruby con SQLite3 e i miei tentativi di utilizzare chiavi esterne in Sqlite3 non hanno avuto esito positivo. Secondo sqlite3 --version, è installata la versione 3.7.13. Per quanto ne so, Sqlite3 supporta chiavi esterne dalla versione 3.6.x.SQLite3 "dimentica" di utilizzare le chiavi esterne

So che le chiavi esterne sono disattivate di default e devono essere attivate con PRAGMA foreign_keys = ON;. Nel mio Rubino db-creare-script, che sto facendo qualcosa di simile:

sql = <<-SQL 
    PRAGMA foreign_keys = ON; 
    CREATE TABLE apps (
    id .... 
); 
    CREATE TABLE requests (
    ... 
    app_id INTEGER NOT NULL, 
    FOREIGN KEY(app_id) REFERENCES apps(id), 
); 
    ... 
SQL 
db.execute_batch(sql) 

Purtroppo, posso tranquillamente inserire righe in requests con sconosciuti app-ids, funziona, ma naturalmente non dovrebbe.

Interessante: utilizzando direttamente il guscio sqlite3, posso osservare il seguente comportamento:

$ sqlite3 database.db 
sqlite> PRAGMA foreign_keys = ON; 
sqlite> PRAGMA foreign_keys; 
1 // as expected 
sqlite> .quit 
$ sqlite3 database.db 
sqlite> PRAGMA foreign_keys; 
0 // off ?! 

senza chiudere il guscio sqlite3, chiavi esterne stanno lavorando dopo di loro attivazione (e non smettere guscio) e Non sono autorizzato a per inserire righe con app_id sconosciute.

+2

I penso di poter rispondere alla mia domanda (in un commento invece di una risposta a causa della bassa ripetizione): La documentazione dice: I vincoli di chiave esterna sono disabilitati di default (per compatibilità all'indietro), quindi devono essere abilitati ** per ogni database connessione separatamente **. Fastidioso, ma finalmente sta funzionando ora. – cara

+0

Domanda correlata: se i dati che violano il vincolo di chiave esterna vengono aggiunti e successivamente il flag foreign_keys è impostato su on: ciò provoca un errore? – gvrocha

risposta

19

Penso di poter rispondere alla mia domanda: La documentazione dice: I vincoli di chiave esterna sono disabilitati di default (per compatibilità all'indietro), quindi deve essere abilitato per ogni connessione di database separatamente. Fastidioso, ma finalmente sta funzionando ora.

9

Inserire questo all'inizio del file che esegue i comandi SQL e abiliterà chiavi esterne in fase di esecuzione.

db = SQLite3::Database.new("database.db") 
db.execute("PRAGMA foreign_keys = ON") 
2

Un modo di trasformare in modo permanente sul FOREIGN_KEYS di default è quello di iniettare la seguente riga nel ~/.sqliterc:

PRAGMA foreign_keys = ON; 

prega di notare che interesserà tutti i database ...

Problemi correlati