2013-08-01 15 views
5

Ho 2 tabelle: A e B. A ha una chiave esterna a B e B ha una chiave esterna a A. Ma non riesco a creare una chiave esterna da A a B, perché A viene creato prima di B.Chiave straniera SQLite?

Come posso risolverlo quando SQLite non supporta Alter Table?

Questo è il mio database di esempio:

Create Table A(
    A_ID INTEGER PRIMARY KEY, 
    B_ID INTEGER, 
    A_DESCRIPTION TEXT, 

    FOREIGN KEY (B_ID) REFERENCES B(B_ID) 
) 

Create Table B(
    B_ID INTEGER PRIMARY KEY, 
    A_ID INTEGER, 
    B_DESCRIPTION TEXT, 

    FOREIGN KEY (A_ID) REFERENCES A(A_ID) 
) 

risposta

1

Credo di fatto prima con la creazione di tabelle in una transazione. Se non funziona cancellerò questa risposta.

+0

Grazie !! .. Cercherò di esso .. –

4

Credo che il problema sia in realtà come si definiscono le chiavi esterne. Definire chiavi esterne circolari funziona bene per me. Prova questa ricerca, invece:

pragma foreign_keys=on; 

Create Table A(
    A_ID INTEGER PRIMARY KEY, 
    B_ID INTEGER REFERENCES B(B_ID), 
    A_DESCRIPTION TEXT 
); 


Create Table B(
    B_ID INTEGER PRIMARY KEY, 
    A_ID INTEGER REFERENCES A(A_ID), 
    B_DESCRIPTION TEXT 
); 
+1

ma in questo caso, quando la tabella 'A' viene creata, la tabella ' B 'non esiste .. come può fare riferimento a B_ID ?? –

10

Si ha un errore di sintassi: c'è una virgola mancante prima di FOREIGN KEY nella tabella B.

In caso contrario, lo schema è corretto. (SQLite interpreterà il REFERENCES clausole solo quando è necessario, quindi non c'è nessun problema di creare un riferimento a una tabella che non esiste ancora.)

prega di notare che l'inserimento di record sarà problematico, a meno che non si inseriscono i record con NULL valori per prima cosa e aggiornali più tardi quando esiste il record referenziato. Potrebbe essere un'idea migliore creare deferred foreign key constraints.

+0

Correggere la virgola mancante. – monojohnny

2

Sqlite supporto ALTER TABLE, ma in una capacità limitata.

Dalla documentazione (http://www.sqlite.org/lang_altertable.html):

The ALTER TABLE command in SQLite allows the user to rename a table or to add a new column to an existing table. It is not possible to rename a column, remove a column, or add or remove constraints from a table.

Dal momento che non si utilizza vincoli per le vostre chiavi esterne, è possibile creare entrambe le tabelle e poi aggiungere le chiavi esterne più tardi con un ALTER TABLE ADD query, che è uno dei pochi comandi alter table che vengono forniti con SQLite.

CREATE TABLE A(
    ID INTEGER PRIMARY KEY, 
    A_DESCRIPTION TEXT 
) 

CREATE TABLE B(
    ID INTEGER PRIMARY KEY, 
    B_DESCRIPTION TEXT 
) 

ALTER TABLE A ADD FOREIGN KEY B_ID B(ID) 
ALTER TABLE B ADD FOREIGN KEY A_ID A(ID) 

Se è necessario aggiungere vincoli al vostro tavolo, this question over here covers it

Problemi correlati