• 浅谈数据库外键


    这个学期的系统开发课,需要做一个和微博相类似的应用,最近在设计数据库的过程中遇到一些问题,表和表之间的外键到底是干嘛的?到底需不需要设计外键?之前学习数据库只是被动地接受了一些概念,对数据库的原理都没有真正地理解。首先外键不影响数据查询,外键约束只是起到是数据库系统地安全性,在对一张表进行增删改的过程会触发约束检验机制从而验证操作的合法性或者级联影响到其他的库表。

    例如:

    学生表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;

  • 相关阅读:
    查看每个核的资源情况
    什么时候使用NO_UNNEST
    走FILTER效率高的2种情况
    PL/SQL 包头和包体
    产品研发要配合好
    ElasticSearch 文档并发处理以及文档路由
    ES(ElasticSearch) 索引创建
    BaikalDB技术实现内幕(三)--代价模型实现
    腾讯位置服务地图SDK自定义地图和路况
    mysql数据库优化
  • 原文地址:https://www.cnblogs.com/zjlyyq/p/6142172.html
Copyright © 2020-2023  润新知