2012-03-30 9 views
23

Tengo un problema con SQLITE3.¿SQLite3 no admite restricciones de clave externa?

He creado 2 mesas persons y orders utilizando la siguiente secuencia de comandos 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> 

A pesar de que la tabla personas es filas vacías se pueden insertar en la tabla orders.

No muestra ningún error.

Cómo es esto posible.

Respuesta

51

En 3.x SQLite, lo que tiene que hacer la siguiente consulta cada vez que se conecta a una base de datos SQLite:

PRAGMA foreign_keys = ON; 

De lo contrario, SQLite ignorará todas las restricciones de clave externa.

¿Por qué cada vez? Compatibilidad con versiones anteriores de SQLite 2.x, según el documentation.

En SQLite 4.x, las restricciones FK serán enabled by default.

+0

cada vez? No es posible tenerlo permanentemente habilitado? – mafu

+0

@mafu Sí, todo el tiempo. He editado la respuesta para explicar por qué. – kijin

+7

Acabo de toparme con esto hoy. Esta es la cosa más tonta. –

0

¿Leyó la documentación? El main page dice que se introdujo con la versión 3.6.19. El link muestra cómo usar claves externas (Su código es correcto).

¿Su código da algún mensaje de error que haya omitido? ¿Revisó todas las condiciones previas especificadas en la documentación?

+0

, por favor dígame cómo eliminar mi versión anterior e instalar la nueva versión de sqlite3. –

+0

@AbbasMulani cómo desinstalar e instalar depende de su sistema operativo y otras cosas. Verifique qué versión está instalada actualmente y cómo fue instalada. El paso para instalar una nueva versión no es tan grande. – mrab

Cuestiones relacionadas