外键的好处:html
可使得两张表关联,保证数据的一致性和实现一些级联操做;spa
/*==============================================================*/.net
/* DBMS name: MySQL 5.0 */references A (id) on delete restrict on update restrict;rest
案例操做一:htm
select * from ablog
id nameit
111 henanio
222 jiantable
select * from bclass
bid id adres
14 222 东北
insert into b values(15,333,'beijing');
[SQL] insert into b values(15,333,'beijing');
[Err] 1452 - Cannot add or update a child row: a foreign key constraint fails (`db_ljf`.`b`, CONSTRAINT `FK_Reference_1` FOREIGN KEY (`id`) REFERENCES `a` (`id`))
提示:小子,想造反呀!你还没大哥呢!
案例二:
delete from a where id=222
[SQL] delete from a where id=222
[Err] 1451 - Cannot delete or update a parent row: a foreign key constraint fails (`db_ljf`.`b`, CONSTRAINT `FK_Reference_1` FOREIGN KEY (`id`) REFERENCES `a` (`id`))
提示:有外键约束,且为Restrict(当取值为No Action或者Restrict时,则当在父表(即外键的来源表)中删除对应记录时,首先检查该记录是否有对应外键,若是有则不容许删除。)
提示:不行呀,有约束的,大哥下面还有小弟,可不能扔下咱们无论呀!
http://www.jb51.net/article/90729.htm
案例三:
delete from b where bid=14
select * from b
bid id adress
select * from a
先看On Delete属性,可能取值如上图为:No Action, Cascade,Set Null, Restrict属性。
当取值为No Action或者Restrict时,则当在父表(即外键的来源表)中删除对应记录时,首先检查该记录是否有对应外键,若是有则不容许删除。
当取值为Cascade时,则当在父表(即外键的来源表)中删除对应记录时,首先检查该记录是否有对应外键,若是有则也删除外键在子表(即包含外键的表)中的记录。
当取值为Set Null时,则当在父表(即外键的来源表)中删除对应记录时,首先检查该记录是否有对应外键,若是有则设置子表中该外键值为null(不过这就要求该外键容许取null)。
当取值为No Action或者Restrict时,则当在父表(即外键的来源表)中更新对应记录时,首先检查该记录是否有对应外键,若是有则不容许更新。
当取值为Cascade时,则当在父表(即外键的来源表)中更新对应记录时,首先检查该记录是否有对应外键,若是有则也更新外键在子表(即包含外键的表)中的记录。
当取值为Set Null时,则当在父表(即外键的来源表)中更新对应记录时,首先检查该记录是否有对应外键,若是有则设置子表中该外键值为null(不过这就要求该外键容许取null)。
http://blog.sina.com.cn/s/blog_5d359d310100w5mb.html