foreign key 外键

5.1 问题

具体要求如下:

创建员工表yg 如表-1所示
创建工资表gz如表-2所示 ,并设置外键实现同步更新与同步删除
测试外键
删除外键

在这里插入图片描述
表-1 员工表yg的数据
在这里插入图片描述
表-2 工资表gz的数据

步骤一:创建外键

1)创建yg表,用来记录员工工号、姓名,其中yg_id列作为主键,并设置自增属性

mysql> CREATE TABLE yg(
    -> yg_id int primary key AUTO_INCREMENT,
    -> name char(16)
    -> )engine=innodb;
Query OK, 0 rows affected (0.15 sec)
Mysql>

2)创建gz表,用来记录员工的工资信息

其中gz_id需要参考员工工号,即gz表的gz_id字段设为外键,将yg表的yg_id字段作为参考键:

mysql> CREATE TABLE gz(
    -> gz_id  int,
    -> name char(16) ,
    -> gz float(7,2) ,
    -> FOREIGN KEY(gz_id) REFERENCES yg(yg_id)  //创建外键
    -> ON UPDATE CASCADE ON DELETE CASCADE //同步更新、同步删除
    -> )engine=innodb;
Query OK, 0 rows affected (0.23 sec)
Mysql>

3)为yg表添加2条员工信息记录

因yg_id有AUTO_INCREMENT属性,会自动填充,所以只要为name列赋值就可以了。

插入表记录可使用INSERT指令,这里先执行下列操作,具体在下一章学习:

mysql> INSERT INTO yg(name) VALUES('Jerry'),('Tom');
Query OK, 2 rows affected (0.16 sec)
Records: 2  Duplicates: 0  Warnings: 0

确认yg表的数据记录:

mysql> SELECT * FROM yg;
+-------+-------+
| yg_id | name  |
+-------+-------+
|     1 | Jerry |
|     2 | Tom   |
+-------+-------+
2 rows in set (0.00 sec)

4)为gz表添加2条工资信息记录

同上,数据参考图-2,插入相应的工资记录(gz_id字段未指定默认值,也未设置自增属性,所以需要手动赋值):

mysql> INSERT INTO gz(gz_id,name,gz)
    -> VALUES(1,'Jerry',12000),(2,'Tom',8000)
    -> ;
Query OK, 2 rows affected (0.06 sec)
Records: 2  Duplicates: 0  Warnings: 0

确认gz表的数据记录:

mysql> SELECT * FROM gz;
+-------+-------+----------+
| gz_id | name  | gz       |
+-------+-------+----------+
|     1 | Jerry | 12000.00 |
|     2 | Tom   |  8000.00 |
+-------+-------+----------+
2 rows in set (0.05 sec)

5)验证表记录的UPDATE更新联动

将yg表中Jerry用户的yg_id修改为1234:

mysql> update yg SET yg_id=1234 WHERE name='Jerry';
Query OK, 1 row affected (0.05 sec)
Rows matched: 1  Changed: 1  Warnings: 0

确认修改结果:

mysql> SELECT * FROM yg;
+-------+-------+
| yg_id | name  |
+-------+-------+
|     2 | Tom   |
|  1234 | Jerry |
+-------+-------+
2 rows in set (0.00 sec)

同时也会发现,gz表中Jerry用户的gz_id也跟着变了:

mysql> SELECT * FROM gz;
+-------+-------+----------+
| gz_id | name  | gz       |
+-------+-------+----------+
|  1234 | Jerry | 12000.00 |
|     2 | Tom   |  8000.00 |
+-------+-------+----------+
2 rows in set (0.00 sec)

6)验证表记录的DELETE删除联动

删除yg表中用户Jerry的记录:

mysql> DELETE FROM yg WHERE name='Jerry';
Query OK, 1 row affected (0.05 sec)

确认删除结果:

mysql> SELECT * FROM yg;
+-------+------+
| yg_id | name |
+-------+------+
|     2 | Tom  |
+-------+------+
1 row in set (0.00 sec)

查看gz表中的变化(Jerry的记录也没了):

mysql> SELECT * FROM gz;
+-------+------+---------+
| gz_id | name | gz      |
+-------+------+---------+
|     2 | Tom  | 8000.00 |
+-------+------+---------+
1 row in set (0.00 sec)

7)删除指定表的外键约束

先通过SHOW指令获取表格的外键约束名称:

mysql> SHOW CREATE TABLE gz\G
*************************** 1. row ***************************
       Table: gz
Create Table: CREATE TABLE `gz` (
  `gz_id` int(4) NOT NULL,
  `name` char(16) NOT NULL,
  `gz` float(7,2) NOT NULL DEFAULT '0.00',
  KEY `name` (`name`),
  KEY `gz_id` (`gz_id`),
  CONSTRAINT `gz_ibfk_1` FOREIGN KEY (`gz_id`) REFERENCES `yg` (`yg_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

其中gz_ibfk_1即删除外键约束时要用到的名称。

删除操作:

mysql> ALTER TABLE gz DROP FOREIGN KEY gz_ibfk_1;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

确认删除结果:

mysql> SHOW CREATE TABLE gz\G
*************************** 1. row ***************************
       Table: gz
Create Table: CREATE TABLE `gz` (
  `gz_id` int(4) NOT NULL,
  `name` char(16) NOT NULL,
  `gz` float(7,2) NOT NULL DEFAULT '0.00',
  KEY `name` (`name`),
  KEY `gz_id` (`gz_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
发布了252 篇原创文章 · 获赞 10 · 访问量 6641

猜你喜欢

转载自blog.csdn.net/weixin_45843450/article/details/105345703