转自http://zjx2988.blog.163.com/blog/static/9791033120150554232742/
1. sqlite3 默认为关闭外键限制的,如要打开,请执行如下命令:
PRAGMA FOREIGN_KEYS=ON;
- sqlite3 外键的创建和使用方法一:
例如,我们创建如下两个表,Persons 和 Orders。
create table persons
(
id_p integer not null,
lastname varchar(20),
firstname varchar(20),
address varchar(100),
city varchar(100),
primary key(id_p)
);
create table orders
(
id_o integer not null,
orderno not null,
id_p integer,
primary key(id_o),
foreign key(id_p) references persons(id_p)
);
假如在 persons 已插入如下数据:
id_p lastname firstname address city
1 Adams John Oxford Street London
2 Bush George Fifth Avenue New York
3 Carter Thomas Changan Street Beijing
外键插入限制:
当执行如下命令往 orders 插入记录时:
insert into orders values(1, 22456, 4);
发生错误 Error: foreign key constraint failed
由于 persons 中没有 id_p 为4记录而导致插入失败。
外键删除限制:
假设 orders 已插入如下数据:
id_o orderno id_p
1 22456 1
当执行如下命令从 persons 删除记录时:
delete from persons where id_p=1;
发生错误 Error: foreign key constraint failed
由于在 orders 中有记录其 id_p=1 导致不能直接从 persons 中删除,必需首先删除 orders 中所有 id_p=1 的记录,才能从 persons 中删除 id_p=1 的记录。
执行 drop table persons; 删除表格时,也必需确保 orders 中所有相关的记录全部删除时,删除表格才能成功。
外键更新限制:
假设 orders 已插入如下数据:
id_o orderno id_p
1 22456 1
当执行如下命令更新 persons 的记录时:
update persons set id_p=4 where id_p=1;
发生错误 Error: foreign key constraint failed
因为 orders 存在 id_p=1 的记录,所有不能在 persons 中直接更新 id_p=1 的记录,必需从 orders 中删除所有 id_p=1 的记录才能在 persons 中任相应的更新。
- sqlite3 外键的创建和使用方法二:
如果想从 persons 中删除或更新相应的记录后,会在 orders 中有相应的体现而不是提示错误。则可按如下方式创建 orders。
create table persons
(
id_p integer not null,
lastname varchar(20),
firstname varchar(20),
address varchar(100),
city varchar(100),
primary key(id_p)
);
create table orders
(
id_o integer not null,
orderno integer not null,
id_p integer,
primary key(id_o),
foreign key(id_p) references persons(id_p) on delete cascade on update cascade
);
外键插入限制:
与方法一保持一致。
外键删除限制:
假设 persons 中已插入方法一中的数据。且 orders 中插入了如下数据:
id_o orderno id_p
1 22456 1
当执行如下命令从 persons 中删除记录时:
delete from persons where id_p=1;
会成功删除 id_p=1 的记录,且连带着 orders 中所有 id_p=1 的记录会自动被删除。
执行 drop table persons; 删除表格时,会成功删除 persons,连带着 orders 中所有相关的记录也会被删除。
外键更新限制:
假设 persons 中已插入方法一中的数据。且 orders 中插入了如下数据:
id_o orderno id_p
1 22456 1
2 22457 1
当执行如下命令更新 persons 中的记录时:
update persons set id_p=4 where id_p=1;
会成功更新 id_p=1 的记录,且 orders 中的记录会自动更改为如下所示:
id_o orderno id_p
1 22456 4
2 22457 4