2013-08-01 12 views
5

Mam 2 tabele: A i B. A ma klucz obcy pod numer B i B ma klucz obcy pod numer A. Ale nie mogę utworzyć klucza obcego z A na B, ponieważ A jest tworzony przed B.Klucz obcy SQLite?

Jak mogę rozwiązać problem, gdy SQLite nie obsługuje Alter Table?

To moja baza danych próbki:

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

Odpowiedz

1

wierzę zrobił to wcześniej przez tworzenie tabel w transakcji. Jeśli to nie zadziała, usunę tę odpowiedź.

+0

Dziękuję !! .. Spróbuję .. –

4

Uważam, że Twoim problemem jest sposób definiowania kluczy zagranicznych. Zdefiniowanie okrągłych kluczy obcych działa dobrze dla mnie. Spróbuj tego zapytania zamiast:

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

ale w tym przypadku, gdy tabela „A” jest tworzony, stół ' B "nie istnieje. W jaki sposób może odnosić się do B_ID? –

10

masz błąd składni: jest przecinek przed FOREIGN KEY brakuje w tabeli B.

W przeciwnym razie Twój schemat jest poprawny. (SQLite interpretuje klauzule REFERENCES tylko w razie potrzeby, więc nie ma problemu tworzenia odniesienie do tabeli, która jeszcze nie istnieje).

Należy pamiętać, że wstawienie rekordy będą problematyczne, chyba że włożysz rekordy z NULL wartości najpierw i zaktualizuj je później, gdy istnieje rekord referencyjny. Może lepiej utworzyć deferred foreign key constraints.

+0

Poprawiono brakujący przecinek. – monojohnny

2

Sqlite ma wsparcie ALTER TABLE, ale w ograniczonej liczbie.

Z dokumentacji (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.

Ponieważ nie używasz ograniczenia do kluczy obcych, można utworzyć obie tabele, a następnie dodać kluczy obcych później z ALTER TABLE ADD zapytania, który jest jedno z niewielu poleceń tabeli zmiennych dostarczanych z 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) 

Jeśli trzeba dodać ograniczenia do stolika, this question over here covers it