zoukankan      html  css  js  c++  java
  • 浅谈数据库外键

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

    例如:

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

  • 相关阅读:
    java.lang.ExceptionInInitializerError异常分析
    项目中碰到的ExceptionInInitializerError异常
    获取全局上下文(getApplicationContext)_创建Shared Preference工具类_实现自动登录
    IntelliJ Idea 常用快捷键列表
    Qt 创建圆角、无边框、有阴影、可拖动的窗口 good
    去掉 Windows 中控件的虚线框(当当 element == QStyle::PE_FrameFocusRect 时,直接返回,不绘制虚线框)
    Qt 显示 GIF
    C++ 查看预处理后的源文件(查看真实代码)
    数据库访问工具 DBUtl(公孙二狗)
    Tornado
  • 原文地址:https://www.cnblogs.com/zjlyyq/p/6142172.html
Copyright © 2011-2022 走看看