在实际开发中,最常见的关联关系就是多对一关系。接下来,在表 student 和表grade 中添加外键约束来建立两个表的关联关系。具体语句如下:
mysql> alter table student add constraint Fk_ID foreign key(gid) REFERENCES grade (id);
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0
语句执行成功后,查看外键约束是否成功添加,查询结果如下:
mysql> show create table student;
+---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| student | CREATE TABLE `student` (
`sid` int NOT NULL,
`sname` varchar(36) DEFAULT NULL,
`gid` int NOT NULL,
PRIMARY KEY (`sid`),
KEY `Fk_ID` (`gid`),
CONSTRAINT `Fk_ID` FOREIGN KEY (`gid`) REFERENCES `grade` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
从查询结果可以看出,student 表的外键约束已经成功添加。此时表 student 和表grade 之间是多对一的关系。因为外键列只能插人参照列存在的值,所以如果要为两个表添加数据,就需要先为主表 grade 添加数据,具体语句如下:
mysql> INSERT INTO grade (id,name)VALUES (1,'软件一班');
Query OK, 1 row affected (0.01 sec)
mysql> INSERT INTO grade (id,name)VALUES (2,'软件二班');
Query OK, 1 row affected (0.00 sec)
在上述语句中,添加的主键id为1和2,由于 student 表的外键与 grade 表的主键关联,因此在为 student 表添加数据时,gid 的值只能是1或2,不能使用其他的值,具体语句如下:
mysql> INSERT INTO student (sid,sname,gid)VALUES(1,'小明',1);
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO student (sid,sname,gid)VALUES(2,'小红',1);
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO student (sid,sname,gid)VALUES(3,'小刚',2);
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO student (sid,sname,gid)VALUES(4,'小华',2);
Query OK, 1 row affected (0.00 sec)
上述语句执行成功后,两个表之间的数据就具有关联性。假如要查询软件一班有酶些学生,首先需要査询软件一班的id,然后根据这个id 在 student 表中查询该班级有哪酶学生,具体步骤如下。
(1)在 grade表中查询出班级名称为“软件一班”的 id,具有语句如下:
SELECT id FRoM grade WHERE name='软件一班';
上述语句执行成功后,结果如下:
mysql> SELECT id FRoM grade WHERE name='软件一班';
+----+
| id |
+----+
| 1 |
+----+
1 row in set (0.00 sec)
从上述结果可以看出,软件一班的 id 为1。(2)在 student表中,查询 gid-1的学生,即为软件一班的学生,具体语句如下:
SELECT sname FROM student WHERE gid=1;
上述语句执行成功后,结果如下:
mysql> SELECT sname FROM student WHERE gid=1;
+--------+
| sname |
+--------+
| 小明 |
| 小红 |
+--------+
2 rows in set (0.00 sec)
从上述结果可以看出,软件一班只有两个学生,一个是小明,一个是小红。