嗯。。直接写吧。
还是举个列子,怕将来的自己忘记了。一对多的关系就好比网上举烂了的一个学生属于一个班级的例子,但是反过来一个班级可以有多名学生。
实现这个关系可以在‘多’的那一边添加一个外键约束, 在这个例子中就是在student表中添加外键约束。可以理解成学生想要知道自己属于哪个班级,所以就要关联班级这张表,怎么关联呢?就在student表中创建一个外键。额。。。照这个例子,我自己理解外键就是外部的一个键值,当我一张表太大了, 想分成两张表来写,然后又要保持原来一张表的一个班级有多个学生的关系,就创建了外键。理解不对的话,再改!
用的环境时centos7和mysql5.7
创建一张学生表和一个班级表 , 只是为了做实验弄懂这个关系创建的表。
学生表如下 :
CREATE TABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL,
`sex` enum('male','female') DEFAULT 'male',
PRIMARY KEY (`id`)
KEY `student_id` (`student_id`),
CONSTRAINT `student_ibfk_1` FOREIGN KEY (`student_id`) REFERENCES `class` (`id`)
)
班级表如下 :
CREATE TABLE `class` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`caption` char(20) DEFAULT NULL,
`class_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
)
注:约束(CONSTRAINT)关键字的后面才是外键名。由于我没有指定外键名,mysql帮我生成了一个,上述创建表得sql语句是用show create table 表名贴出来的,然后我把结果稍作了些修改。
创建好了, 我们输入一些数据,如下:
学生表中插入
insert into student(name, student_id) values('钢蛋', 1), ('铁锤', 2), ('山炮', 3), ('胖墩', 4), ('张三', 1);
教室表中插入
insert into class(caption) values('1class'), ('2class'), ('3class'), ('4class');
然后执行查询操作:
mysql> select * from student, class where student.student_id=class.id;
+----+--------+--------+------------+----+---------+
| id | name | sex | student_id | id | caption |
+----+--------+--------+------------+----+---------+
| 1 | 钢弹 | male | 1 | 1 | 3class |
| 5 | 张三 | male | 1 | 1 | 3class |
| 2 | 铁锤 | male | 2 | 2 | 4class |
| 3 | 山炮 | male | 3 | 3 | 5class |
| 4 | 胖墩 | female | 4 | 4 | 6class |
+----+--------+--------+------------+----+---------+
5 rows in set (0.00 sec)
在student表中设置了student_id为外键,此时student.student_id=class.id, 这样当我们查询的时候,就会查询到属于一个班级的学生了。
还琢磨了一对一和多对多的关系,一对一没琢磨出来,多对多的关系再补吧。用到了一些mysql语句,记录一下,虽然随便百度都能一大把:
- 插入语句 insert into 表名(字段名) value('value1') ......(可以有很多个值);
- 更新字段的值 update 表名 set 字段名='NEW_VALUE' where 能定位更改字段的条件(例如id=3);
- 删除外键 alter table 表名 drop foreign key 外键名(本例中的class_ibfk_1);
- 只删除外键是不能删除这个字段的,要删除这个字段还需要drop掉字段
- 增加外键 alter table 表名 add foreign key(字段名) references 另一张表的表名(另一张表的唯一键);
- 增加一个新的字段 alter table 表名 add column 字段名 属性;