2012-03-30 61 views
23

我有一个SQLITE3的问题。SQLite3不支持外键约束吗?

我曾尝试使用以下SQL脚本创建2个表personsorders

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> 

即使个人表是空行可以插入到表orders

它不显示任何错误。

这怎么可能。

回答

51

在SQLite的3.x中,你必须让每一次您连接到一个SQLite数据库以下查询

PRAGMA foreign_keys = ON; 

否则SQLite将忽略所有外键约束。

为什么每一次?根据documentation,向后兼容SQLite 2.x。

在SQLite 4.x中,FK限制将是enabled by default

+0

每次?永久启用它是不可能的? – mafu 2014-03-09 09:27:11

+0

@mafu是的,每一次。我编辑了答案来解释原因。 – kijin 2014-03-10 08:54:36

+7

今天刚刚遇到了这个。这是最笨的东西。 – 2014-03-24 03:56:49

0

您是否阅读过文档? main page表示它在3.6.19版本中引入。 link显示如何使用外键(您的代码是正确的)。

您的代码是否给出了您省略的错误消息?您是否检查了文档中指定的所有先决条件?

+0

那么请告诉我如何删除旧版本并安装新版本的sqlite3。 – 2012-03-30 06:14:57

+0

@AbbasMulani如何卸载和安装取决于你的操作系统和其他东西。检查当前安装的版本以及安装方式。安装新版本的步骤并不那么大。 – mrab 2012-03-30 06:26:38