2012-01-05 19 views
8

sembra che i vincoli di chiavi esterne siano supportati dalla versione 3.6.x in SQLite. La versione di SQLite su IOS 5.0 è 3.7.7 (trovata in sqlite3.h).SQLite - Contraints chiavi esterne - IO 5

Ma quando provo a inserire una riga in una tabella con un vincolo, la mia riga viene inserita correttamente anche se la chiave esterna correlata non esiste. Non ho errori

Fare la stessa istruzione di inserimento usando applicazioni come Navicat mi dà un "errore di violazione di vincolo"

fai a sapere se le chiavi esterne sono supportate su iOS 5?

Ecco lo schema del database:

CREATE TABLE artist(
    artistid INTEGER PRIMARY KEY, 
    artistname TEXT 
) 

CREATE TABLE "track" (
    "trackid" INTEGER PRIMARY KEY AUTOINCREMENT, 
    "trackname" TEXT, 
    "trackartist" INTEGER, 
    CONSTRAINT "trackartist" FOREIGN KEY ("trackartist") REFERENCES "artist" ("artistid") ON DELETE CASCADE ON UPDATE CASCADE) 

molto semplice, non è vero?

Grazie Emmanuel

+0

Puoi pubblicare il codice in cui stai inserendo nel tavolo? – Eric

+0

Ciao, sto usando FMDatabase, il codice è molto semplice: [db execUpUpdate: @ "inserisci in traccia (trackname, trackartist) valori (?,?)", @ "new track", [NSNumero numeroWithInt: i ]] – ecaste

+0

Strano ... Ho lo stesso identico scenario che hai ... (Navicat, iOS, FMDB). Stesso problema. Devo amare COSÌ. – walkingbrad

risposta

13

chiave esterna sono disabilitati di default. Devi abilitarli separatamente per ogni connessione. L'impostazione non è "appiccicosa". Devi farlo ogni volta che ti connetti a un database SQLite.

PRAGMA foreign_keys = ON; 

Le probabilità sono buone che Navicat si prende cura di questo per te. Nel tuo codice, è il tuo lavoro.

+0

È grandioso, ma come faccio? Devo solo eseguire questo al DB? Come si usa questa riga di codice 'PRAGMA foreign_keys = ON'? – Daniel

+0

@Daniel: Sì, lo si esegue come se fosse un'istruzione SQL. [Dettagli sull'interfaccia C di SQLite] (http://www.sqlite.org/c3ref/prepare.html) –

+0

Grazie, ha funzionato e ora. Saluti – Daniel

4

Finalmente ho trovato la soluzione .... e ho detto che avevi ragione.

Per impostazione predefinita, il database sqlite viene aperto con l'opzione delle chiavi esterne disabilitata, anche se le tabelle sono state costruite con vincoli di chiavi esterne!

Quindi solo fare questa semplice richiesta:

PRAGMA foreign_keys=ON; 

poco dopo l'apertura del database, e al di fuori di una transazione (se si utilizza fmdatabase e funzionalità transazioni)

Spero che questo vi aiuterà a qualcun altro.

Emmanuel

2

Questo è come lo faccio usando FMDB:

[database executeUpdate:@"PRAGMA foreign_keys=ON"]; 
0

E 'sulla doc: SQLite Doc

e quando si apre la connessione:

[database executeUpdate:@"PRAGMA foreign_keys=ON"]; 
Problemi correlati