2012-03-30 4 views
23

Mam problem z SQLITE3.Czy SQLite3 nie obsługuje ograniczeń klucza obcego?

Stworzyłem 2 tabele persons i orders stosując następujący skrypt SQL:

sqlite> create table Persons(
      P_Id int primary key, 
      LastName varchar, 
      FirstName varchar, 
      Address varchar, 
      City varchar 
     ); 

sqlite> create table Orders(
      O_Id int NOT NULL, 
      OrderNo int NOT NULL, 
      P_Id int, 
      PRIMARY KEY (O_Id), 
      FOREIGN KEY (P_Id) REFERENCES Persons(P_Id) 
     ); 

sqlite> insert into Orders values(1,77895,3); 

sqlite> select * from Orders; 

1|77895|3 

sqlite> 

Choć tabela osób jest puste wiersze mogą być wstawiane do tabeli orders.

Nie pokazuje żadnego błędu.

Jak to jest możliwe.

Odpowiedz

51

W SQLite 3.x, trzeba zrobić następujące zapytanie każdym razem łączenia się z bazą danych SQLite:

PRAGMA foreign_keys = ON; 

W przeciwnym razie SQLite zignoruje wszystkie ograniczenia klucza obcego.

Dlaczego za każdym razem? Kompatybilność wsteczna z SQLite 2.x, zgodnie z documentation.

W SQLite 4.x, ograniczenia FK będzie enabled by default.

+0

Za każdym razem? Nie można go na stałe włączyć? – mafu

+0

@mafu Tak, za każdym razem. Zmieniłem odpowiedź, aby wyjaśnić, dlaczego. – kijin

+7

Właśnie wpadłem na to dzisiaj. To najgłupsza rzecz. –

0

Czy przeczytałeś dokumentację? main page mówi, że został wprowadzony w wersji 3.6.19. link pokazuje, jak używać obcych kluczy (Twój kod jest poprawny).

Czy Twój kod zawiera komunikaty o błędach, które pominąłeś? Czy sprawdziłeś wszystkie warunki wstępne określone w dokumentacji?

+0

następnie proszę powiedz mi, jak usunąć moją starszą wersję i zainstalować nową wersję sqlite3. –

+0

@AbbasMulani sposób odinstalowania i instalacji zależy od twojego systemu operacyjnego i innych rzeczy. Sprawdź, która wersja jest aktualnie zainstalowana i jak została zainstalowana. Krok do zainstalowania nowej wersji nie jest tak duży. – mrab