sqlite3 外键作用原理和使用方法

转自http://zjx2988.blog.163.com/blog/static/9791033120150554232742/
1. sqlite3 默认为关闭外键限制的,如要打开,请执行如下命令:

PRAGMA FOREIGN_KEYS=ON;
  1. 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 中任相应的更新。

  1. 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
  • 8
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值