MySQL外键的作用和创建
MySQL外键的作用:
保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。使两张表形成关联,外键只能引用外表中列的值!
我们来建两个表
CREATE TABLE `example1` (
`stu_id` int(11) NOT NULL DEFAULT '',
`course_id` int(11) NOT NULL DEFAULT '',
`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中的数据也没有了;
其实啊,外键就这个作用,保持数据一致性,完整性,是不让改还是一起改,由事件触发器决定;
有个疑问一直不明白【外键别名到底有什么用】,知道的大神麻烦告知,谢谢
今天问了公司几个大神,他们给的答案是,外键都很少用,这个更不懂(暗自窃喜中,哈哈)
MySQL外键的作用和创建的更多相关文章
- MySQL外键的设置及作用
原文地址:http://www.php100.com/html/webkaifa/database/Mysql/2010/0830/5342.html 外键的作用: 保持数据一致性,完整性,主要目的是 ...
- 如何在MySQL中设置外键约束以及外键的作用
1.外键的作用,主要有两个: 一个是让数据库自己通过外键来保证数据的完整性和一致性 一个就是能够增加ER图的可读性 2.外键的配置 1)先创建一个主表,代码如下: #创建表studen ...
- mysql外键创建不成功/失效
当前mysql版本:SELECT VERSION();结果为:5.5.40. 在复习mysql外键约束时创建表格:stu与grade,目标:grade的id随着student的id级联更新,且限制删除 ...
- 浅谈 MySQL的外键的作用
MySQL中外键的介绍: MySQL外键必须使用存储引擎为 innDB 其中MySAM 和MEMORYH这两种引擎不支持 由数据库自身保证数据一致性,完整性,更可靠,因为程序很难100%保证数据的 ...
- MySQL外键之级联
简介 MySQL外键起到约束作用,在数据库层面保证数据的完整性.例如使用外键的CASCADE类型,当子表(例如user_info)关联父表(例如user)时,父表更新或删除时,子表会更新或删除记录,这 ...
- mysql 外键(FOREIGN KEY)
最近有开始做一个实验室管理系统,因为分了几个表进行存储·所以要维护表间的关联··研究了一下MySQL的外键. (1)只有InnoDB类型的表才可以使用外键,mysql默认是MyISAM,这种类型不支持 ...
- MySQL外键约束On Delete、On Update各取值的含义
主键.外键和索引的区别? 主键 外键 索引 定义: 唯一标识一条记录,不能有重复的,不允许为空 表的外键是另一表的主键, 外键可以有重复的, 可以是空值 主索引(由关键字PRIMARY定义的索引) ...
- mysql外键使用和级联
如下面的: create table applicant (id int not null auto_increment primary key, jobId int not null, studen ...
- Mysql 外键设置
MySql外键设置详解 (1) 外键的使用: 外键的作用,主要有两个: 一个是让数据库自己通过外键来保证数据的完整性和一致性 一个就是能够增加ER图的可读性 有些人认为外键的建立会给 ...
随机推荐
- OpenVPN GUI: "No TAP-WIN32 adapters on this system"
找到C:\Program Files\TAP-Windows\bin 管理员身份运行: deltapall.bat addtap.bat
- Java多线程:线程同步与关键字synchronized
一.同步的特性1. 不必同步类中所有的方法, 类可以同时拥有同步和非同步方法.2. 如果线程拥有同步和非同步方法, 则非同步方法可以被多个线程自由访问而不受锁的限制. 参见实验1:http://blo ...
- JS面向对象基础1
根据之前看了面向对象相关的视频,按照自己的理解,整理出相关的笔记,以便自己的深入理解. 如果要判断两个数是否相等,将值乘以10或者100,转换成整数再进行比较 例如:a++与++a 短路运算符 ...
- CABasicAnimation 几种停止的回调
一.编写一个简单的动画,使一个UIview从屏幕的左上角移动到左下角,间隔时间3S // // ViewController.m // CAAnimationTest // // Created by ...
- 为什么推荐Zookeeper作注册中心
Zookeeper的数据模型很简单,有一系列被称为ZNode的数据节点组成,与传统的磁盘文件系统不同的是,zk将全量数据存储在内存中,可谓是高性能,而且支持集群,可谓高可用,另外支持事件监听.这些特点 ...
- 【其他】MySql常用命令
Linux下: 登陆命令 mysql -h [hostname] -u [username] -p [password]修改密码 mysqladmin –u[username] –p[oldpwd] ...
- table可更改th大小的jQuery插件
(function ($) { $.fn.resizetable = function () { var tableObj = $(this); var inResizeRange = false; ...
- 可写的计算监控(Writable computed observables)
新手可忽略此小节,可写依赖监控属性真的是太advanced了,而且大部分情况下都用不到. 一般情况下,计算监控的值是通过其他监控属性的值计算出来的,因此它是只读的.这个看似很奇怪,我们有什么办法可以让 ...
- ASP.NET中的Excel操作(OLEDB方式)
一:OLEDB方式操作Excel的个人理解 就是把要操作的Excel当作一个数据库,所有对Excel的操作,就变成了对“数据库”的操作.那么这时就需要有一个数据库的连接字符串. 代码如下: connS ...
- webstorm2016.2.4激活码
测试日期:2016.11.07 webstorm版本:2016.2.4 系统环境:MacOS(windows环境应该也行) 激活码如下: 43B4A73YYJ-eyJsaWNlbnNlSWQiOiI0 ...