MySQL表的增删改查(进阶)上
1. 数据库约束
下表为在数据库中表的结构设计时的一些字段约束类型 举例:
-
创建班级表classes,id为主键
drop table if exists classes; create table classes( id int primary key auto_increment, name varchar(20), `desc` varchar(20) );
desc为关键字,所以我们在以关键字为变量名时需要用``括起来。 auto_increment相当于Java中的i++这一功能。 所以主键约束 primary key一般与auto_increment搭配使用,在插入数据时如果没有插入id的信息,则他会在上一行id的基础上自动加1,来保证在插入数据时我们的id是唯一的。
-
创建学生表student,一个学生对应一个班级,一个班级对应多个学生。使用id为主键,classes_id为外键,关联班级表id。
下图为上面代码的实操
2. 表的设计
表的三大范式: 2.1 一对一 现在我们有两张表,一张表存人的基本信息另一张存身份证的信息,通过一个人只能查到一个对应的身份证信息,一个身份证只能查到一个人。 (不要说什么世界上有那么多的人叫张三,但是他们的身份证号一样吗?我们这里只是举一个例子)
2. 2一对多 一对多同理,两张表,上面我们已经创建了一个班级表和一个学生表,那么学生和班级的关系是什么呢? 答:一个学生他只对应一个班级,但是一个班级他可以对应n个学生。
2.3 多对多
多对多比较特殊,但是确是重点。思考一下,学生和课程有直接关系吗?没有(当然从实际中来说不是说完全没有,是因为我们两张表的主键设计迫使他们不能直接产生关系,这里你就当他们没有关系),所以我们需要一个中间表来使他们产生关系,就是学生成绩表,一个学生他的他的成绩表里可以有m个课程的成绩,一个课程可以他可以出现在n个考试成绩表里,从而间接的使学生和课程产生关系。
以上就是我们在MySQL中的三种表的关系。
这里我们在插入一张学生课程表和学生成绩表,方便我们后续对多表进行操作。
-- 创建学生课程表 drop table if exists course; create table course( id int primary key auto_increment, name varchar(20) ); -- 创建学生课程中间表,考试成绩表 drop table if exists score; create table score( id int primary key auto_increment, score decimal(3,1), student_id int, course_id int, foreign key (student_id) references student(id), foreign key (course_id) references course(id) );
3. 新增
-- 创建用户表 drop table if exists test_user; create table test_user( id int primary key auto_increment, name varchar(20) comment 姓名, math int comment 数学成绩, english int comment 英语成绩, mobile varchar(20) comment 手机号 );
将上章中创建的exam_result表中的所有数据复制到用户表 insert into test_user(name,math,english) select name,math,english from exam_result; 另外说一下,comment的备注是可以被查到的(可以防止你忘记某个字段索要表达的意思),利用 show full columns from test_user; 进阶版的查询后续补上,实在写不动了!