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