zoukankan      html  css  js  c++  java
  • MySQL中的外键是什么、有什么作用

    MySQL外键的作用:

    保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。使两张表形成关联,外键只能引用外表中列的值!

    我们来建两个表

    复制代码
    CREATE TABLE `example1` (
      `stu_id` int(11) NOT NULL DEFAULT '0',
      `course_id` int(11) NOT NULL DEFAULT '0',
      `grade` float DEFAULT NULL,
      PRIMARY KEY (`stu_id`,`course_id`)
    );
    CREATE TABLE `example2` (
      `id` int(11) NOT NULL,
      `stu_id` int(11) DEFAULT NULL,
      `course_id` int(11) DEFAULT NULL,
      PRIMARY KEY (`id`),
      KEY `f_ck` (`stu_id`,`course_id`),
      CONSTRAINT `f_ck` FOREIGN KEY (`stu_id`, `course_id`) REFERENCES `example1` (`stu_id`, `course_id`)
    );
    insert into example1 (stu_id,course_id,grade)values(1,1,98.5),(2,2,89);
    insert into example2 (id,stu_id,course_id)values(1,1,1),(2,2,2);

    复制代码

    我们建了

    example1表,里面包含stu_id学号,course_id课程号,grade分数

    example2表,里面包含id,stu_id学号,course_id课程号,然后建立外键

    分别插入数据到两个表中。

    我们把example2中的stu_id和course_id称为example2表的外键,example1是父表,example2是字表,两个表形成关联,必须字表的数据删除后,才能删除父表中的对应数据

    现在我们来删除example1中的一条数据

    delete from example1 where stu_id=2;

    会发现报错

    ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`test`.`example3`, CONSTRAINT `f_ck` FOREIGN KEY (`stu_id`, `course_id`) REFERENCES `example2` (`stu_id`, `course_id`))

    因为example2中的数据关联了example1的数据,这样是删不了的,达到了外键的作用;

     

    然后我们来先删除example2表中的数据,再删除example1表中的数据

    delete from example2 where stu_id=2;

    delete from example1 where stu_id=2;

    这样就成功了;


     

    事件触发限制: 

    on delete和on update , 可设参数cascade(跟随外键改动), restrict(限制外表中的外键改动),set Null(设空值),set Default(设默认值),[默认]no action

    我们来看看事件触发限制是干嘛的。。。

    我们先删除外键,然后重新建立外键带上事件触发限制

    alter table example2 drop foreign key f_ck;
    alter table example2 add CONSTRAINT `f_ck` FOREIGN KEY (`stu_id`, `course_id`) REFERENCES `example1` (`stu_id`, `course_id`) ON DELETE CASCADE ON UPDATE CASCADE;

    我们先查看一下数据

    mysql> select * from example1;select * from example2;

    +--------+-----------+-------+

    | stu_id | course_id | grade |

    +--------+-----------+-------+

    |      1 |         1 |  98.5 |

    +--------+-----------+-------+

    1 row in set (0.00 sec)

    +----+--------+-----------+

    | id | stu_id | course_id |

    +----+--------+-----------+

    |  1 |      1 |         1 |

    +----+--------+-----------+

    1 row in set (0.00 sec)

    这时example1和example2中的stu_id和course_id都是1,

    再来修改example1表中的数据看看

    update example1 set stu_id=3,course_id=3 where stu_id=1;

    再来查看数据

    mysql> select * from example1;select * from example2;

    +--------+-----------+-------+

    | stu_id | course_id | grade |

    +--------+-----------+-------+

    |      3 |         3 |  98.5 |

    +--------+-----------+-------+

    1 row in set (0.00 sec)

    +----+--------+-----------+

    | id | stu_id | course_id |

    +----+--------+-----------+

    |  1 |      3 |         3 |

    +----+--------+-----------+

    1 row in set (0.00 sec)

    发现没,example1和example2中的stu_id和course_id都变成了3

     

    我们在来删除example1表中的数据

    delete from example1 where stu_id=3;

    会发现可以删除,而且example2中的数据也没有了;


     

    其实啊,外键就这个作用,保持数据一致性,完整性,是不让改还是一起改,由事件触发器决定;

    有个疑问一直不明白【外键别名到底有什么用】,知道的大神麻烦告知,谢谢

    今天问了公司几个大神,他们给的答案是,外键都很少用,这个更不懂(暗自窃喜中,哈哈)

  • 相关阅读:
    jQuery 语法
    jQuery 简介
    把数据存储到 XML 文件
    XML 注意事项
    XML DOM (Document Object Model) 定义了访问和操作 XML 文档的标准方法。
    通过 PHP 生成 XML
    XML 命名空间(XML Namespaces)
    XML to HTML
    XMLHttpRequest 对象
    使用 XSLT 显示 XML
  • 原文地址:https://www.cnblogs.com/yehuisir/p/10663152.html
Copyright © 2011-2022 走看看