数据更新

数据更新

MySQL中提供了功能丰富的数据库更新操作语句,包括向数据库中插入数据的insert语句、修改数据的update语句,以及当数据不再使用时删除数据的delete语句。

插入数据

插入完整的数据记录

例如,向tb_student中插入一条新纪录:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
use db_school;
insert into tb_student
values
('2014210103', '王玲', '女', '1998-02-21', '安徽', '汉', 'CS1401');

# 指定字段添加
insert into tb_student(studentNo, studentName, sex, birthday, native, nation, classNo)
values
('2013110102', '赵婷婷', '女', '1996-11-30', '天津', '汉', 'AC1301');

# 指定部分字段添加
insert into tb_student(studentNo, studentName, native, nation, sex, birthday, classNo)
values
('2013110203', '孟颖', '上海', '汉', '女', '1997-03-20', 'AC1302');

为表的指定字段插入数据

为表的指定字段插入数据就是在insert语句中只给部分字段的插入值,而其他字段的值为缺省值,没有定义缺省值的字段应运行取空值。
例如:

1
2
3
4
5
insert into tb_student(studentNo, studentName, sex, nation, classNo)
values
('2014310103', '孙新', '男', '傣', 'IS1401');

select * from tb_student;

同时插入多条数据记录

例如:

1
2
3
4
5
insert into tb_student(studentNo, studentName, sex, classNo)
values
('2014310104', '陈卓卓', '女', 'IS1401'),
('2014310105', '马丽', '女', 'IS1401'),
('2014310106', '许江', '男', 'IS1401');

插入查询结果

该用法的语法格式为:

1
2
insert into tb_name1 (column_list1)
select column_list2 from tb_name2 where (condition);

例如,假设要为表tb_student制作一个备份表tb_student_copy,两个表的结构完全一致,现使用insert···select将表tb_student中的数据备份到新建表tb_student_copy中:

1
2
3
4
5
6
7
8
9
10
11
12
13
create table tb_student_copy
(
studentNo char(10),
studentName varchar(20),
sex char(2) not null,
birthday date,
native varchar(20),
nation varchar(10),
classNo char(6),
constraint PK_student primary key (studentNo)
);
insert into tb_student_copy
select * from tb_student;

使用replace语句插入表数据

若一个待插入的表中存在有primary key或unique约束,而待插入的数据行中包含有与待插入表的已有数据行中相同的primary key 或 unique列值,那么insert语句将无法插入此行。此时,如果需要插入这行数据,则可使用replace语句来实现。
例如:

1
2
3
replace into tb_student_copy(studentNo, studentName, sex, birthday, native, nation, classNo)
values
('2013110101', '周旭', '男', '1996-10-01', '湖南', '汉', 'AC1301');

注意,如果数据表的某个字段定义了外码,使用replace into插入数据时依然会出错。

修改数据记录

其语法格式为:

1
2
3
update tb_name
set column1=value1, ······, column n = value n
[where <condition>];

修改特定数据记录

例如:

1
2
3
4
5
update db_school.tb_student
set studentName = '黄涛',
native = '湖北',
nation = default
where studentNo = '2014210101';

修改所有数据记录

例如将成绩表tb_score中所有学生的成绩提高5%:

1
2
update db_school.tb_score
set score = score * 1.05;

带子查询的修改

例如,将选修了“程序设计”这门课的学生成绩置0:

1
2
3
4
5
6
7
8
9
# 将选修了“程序设计”这门课的学生成绩置0
update db_school.tb_score
set score = 0
where courseNo = (select courseNo from tb_course where courseName = '程序设计');

# 查看修改结果
select studentNo, tb_score.courseNo, courseName, score
from tb_course, tb_score
where tb_course.courseNo = tb_score.courseNo and courseName = '程序设计';

删除数据记录

删除特定的数据记录

例如,删除王一敏的学生信息:

1
2
3
4
5
6
7
8
9
# 先看一下她的信息
select *
from tb_student_copy where studentName = '王一敏';
# 删除
delete from tb_student_copy
where studentName = '王一敏';
# 再看一下
select *
from tb_student_copy where studentName = '王一敏';

带子查询的删除

例如,将程序设计这门课的所有选课记录删除:

1
2
3
4
5
6
7
# 带子查询的删除
delete from db_school.tb_score
where courseNo = (select courseNo from tb_course where courseName = '程序设计');
# 查看结果
select studentNo, tb_score.courseNo, courseName, score
from tb_course, tb_score
where tb_course.courseNo = tb_score.courseNo and courseName = '程序设计';

删除所有数据记录

例如,删除所有学生的选课记录

1
2
3
4
delete from db_school.tb_score;
# 查看结果
select *
from tb_score;

如果要删除表中的所有记录,还可以使用truncate语句。truncate语句将直接删除原来的表并重新创建一个表,而不是逐行删除表中的记录,因此执行速度会比delete快。

1
2
# 或者,使用truncate语句
truncate db_school.tb_student_copy;

truncate语句使用起来非常简单,但是需要注意以下几点:

  1. 由于truncate语句在功能上与不带where子句的delete语句相同,它将删除表中的所有数据,且无法恢复,因此使用的时候要非常谨慎。
  2. 使用truncate语句后,表中的auto_increment计数器会被重新设置为该列的初始值。
# MySQL

评论

程振兴

程振兴 @czxa.top
截止今天,我已经在本博客上写了604.4k个字了!

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×