了解MySQL中的外键作用

了解MySQL中的外键作用

【相关学习推荐:mysql学习】

MySQL外键的作用:

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

我们来建两个表

CREQ H C 3 # I yATE TABLE `example1` (
`stu_id` int(11) NOT NULL DEFAULT '0',
`courR O H E gse_id` int(11) NOT NULL DEFAULb q kT '0',
`grade` float DEFAULT NULL,
PRIMARY KEY (`stup n Z ] B V_id`,`course_id`)
);
CREATE TABLE `example2` (
`id` int(11) NOT NUG P vLL,
`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 KEc & x ~  gY (`stu_id`, `course_id`) REFERENCES `example1` (`stu_id`, `course_id`)
);
insert in, z uto 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是字表,两个表形成关联,必须字表的数据删除后,才能删除c ^ 2 O e S G L父表中的对应数据

现在我们来删除example5 } / [ n L y1中的一条数据

delete from example1 where stu_id=2;

会发现报错

ERROR 1451 (23000): Cannot del~ Y W 3 % b 0 z 2ete or updatC n 7e a parent row: a foreign key constraint fails (`test`.`example3`, CONSTRAINT `f_ck` FOd : _ [ 8 ] ARa T {EIGN KEY (`stu_id`, `course_id`) REFERENCES `example2` (`stu_id`, `course_id`))

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

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

delete from example2 where stu_id=2;

delete from eV l ?xamp+ k h l 8 Kle1 where stu_idn f 4 F ~ . @ q ]=2;

这样就成功了;

事件触发限制:

on delete和on update , 可设参数cascade(跟随外键改动), restrict(限制外表中的外键改动),set Null(设空值),set DQ 2 I E , ! %efault(B m { ` L H设默认值),[默认]no action

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

我们先删除外键,然后重b T w P 9 v z新建立外键带上事件触发限制

alter table exs 2 X G N r ~ample2 drop foreign key f_ck; alter tabl! 6 1 g m n ] pe exJ I 8 a % T z Pample2 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)q o ^ ? ? H o
+----+--------+-------K 7 j h ^ p ^ f----+
| id | stu_idf $  ] ? | course_id |
+----+--------+-----------+
|  1 |      1 |         1 |
+--w ` I U h--+--------+--------& Q v ---+
1 row in set (0.00 sec)

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

再来修改example1表中的数据看看b k ; E -

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

再来查看数据

mysql> select * fromu b L e g T t exampl^ U = E 1 N ^e1;select * from example2;

+--------+-----------+-------+
| stu_id | course_id | grade |
+--------+-----------+-------+
|      3 |         3 |  98.5 |
+--------+-----------+-------+
1 row in set (V d _ [ W 6 d l D0.00 sec)
+----+--------+-----------+
| id | stu_id | course_id |
+--6 % t s--+--------+-----------+
|  1 |      3 |         3 |
+----+--------+-----------+
1D = - |  G row in set (0.00 sec)

发现没E t | - U | R,example1和example2中的stu_id和course_id都变成了3

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

delete from example1 where stu_id=3;

会发现可以删除,而且examplY v . oe2中的数据也没有了;

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

相关学习推荐:编程视频

以上就是了解MySQL中的外键作用的详细内容。