这个学期的系统开发课,需要做一个和微博相类似的应用,最近在设计数据库的过程中遇到一些问题,表和表之间的外键到底是干嘛的?到底需不需要设计外键?之前学习数据库只是被动地接受了一些概念,对数据库的原理都没有真正地理解。首先外键不影响数据查询,外键约束只是起到是数据库系统地安全性,在对一张表进行增删改的过程会触发约束检验机制从而验证操作的合法性或者级联影响到其他的库表。
例如:
学生表stu:
属性 | 类型 | 是否空 | 主键/外键 |
id | int(8) | 否 | 主键 |
sex | char(4) | 否 | |
phone | char(11) | 否 | |
stu_name | char(20) | 否 |
表中数据:
id | sex | phone | stu_name |
1 | 男 | 17764534644 | 张三 |
2 | 女 | 17764530241 | 王婷 |
书籍表books:
属性 | 类型 | 是否空 | 主键/外键 |
id | int(8) | 否 | 主键 |
book_name | char(20) | 否 |
表中数据:
id | book_name |
1 | 郭德纲相声选 |
2 | 茶花女 |
借书关系表relation:
属性 | 类型 | 是否空 | 主键/外键 |
relation_id | int(8) | 否 | 主键 |
stu_id | int(8) | 否 | 外键(参照stu表中的id) |
book_id | int(8) | 否 | 外键(参照books表中的id) |
表中数据:
relation_id | stu_id | book_id |
1 | 1 | 1 |
2 | 1 | 2 |
3 | 2 | 2 |
4 | 2 | 1 |
外键关系如上:
顺便复习下数据库的几个常用语句:
1.已经创建好的数据库添加外键约束:
默认约束条件restrict:限制外表中的键改动
alter table relation add constraint FK_relation_stu_stu_id foreign key(stu_id) references stu(id)
在删除时随外键改动:
alter table relation add constraint FK_relation_books_book_id foreign key(book_id) references books(id) on delete cascade
2.删除数据库的一条记录:
delete from relation where relation.stu_id = 1
此时,若要删除stu表中id = 1的人的信息,应该是报错的,因为relation表里的stu_id的外键约束为restrict,默认禁止外键的修改,而要删除books表里id=2的书本的信息时,relation表里的第2,3两条记录也会被删除,因为relation表里的book_id的外键约束为on delete cascade,即在删除操作时跟随外键改动:
下面,看下运行结果:
当删除stu表中id = 1的人的信息:
delete from stu where id = 1
报错:
20:05:06 delete from stu where id = 1 Error Code: 1451. Cannot delete or update a parent row: a foreign key constraint fails (`mytest1`.`relation`, CONSTRAINT `FK_relation_stu_stu_id` FOREIGN KEY (`stu_id`) REFERENCES `stu` (`id`)) 0.000 sec
当删除books表里id=2的书本的信息时:
delete from books where id = 2
成功
此时:查看relation表的数据:
SELECT * FROM mytest1.relation;