# 数据修改
数据的操作主要可以分为两大类:1.查询操作;2.修改操作。
MySQL
主要有3种操作,这些操作都会对表数据进行修改。
语句 | 说明 |
---|---|
insert | 增加数据 |
delete | 删除数据 |
update | 更新数据 |
# 插入数据:insert
# insert 语句
在 MySQL
中,我们可以使用 insert
语句来往一张表中插入数据。插入数据,也就是“增加数据”
insert into 表名(列1, 列2, …, 列n)
values(值1, 值2, …, 值n)
1
2
2
**示例:**创建水果表
-- 创建表格
CREATE TABLE fruits (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50),
type VARCHAR(50),
season VARCHAR(20),
price DECIMAL(10, 2),
date DATE
);
-- 插入数据
insert into fruit
values
('葡萄', '浆果', '夏', 27.3, '2022-08-06'),
('柿子', '浆果', '秋', 6.4, '2022-10-20'),
('橘子', '浆果', '秋', 11.9, '2022-09-01'),
('山竹', '仁果', '夏', 40.0, '2022-07-12'),
('苹果', '仁果', '秋', 12.6, '2022-09-18'),
('梨子', '仁果', '秋', 13.9, '2022-11-24'),
('西瓜', '瓜果', '夏', 4.5, '2022-06-01'),
('菠萝', '瓜果', '夏', 11.9, '2022-08-10'),
('香瓜', '瓜果', '夏', 8.8, '2022-07-28'),
('哈密瓜', '瓜果', '秋', 7.5, '2022-10-09');
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 特殊情况
顺序不一致
MySQL
会根据字段名来匹配对应的值,即使它与表格定义的顺序不一致INSERT INTO fruit (type, season, price, date, name) VALUES ('浆果', '夏', 22.3, '2022-08-15','蓝莓');
1
2插入部分字段的情况
如果你只想插入部分字段的数据,你可以在
INSERT
命令中仅指定这些字段,并相应地提供值。未指定的字段将使用它们的默认值(如果定义了默认值)或者为NULL
(如果允许NULL
值)。INSERT INTO fruit (type, price, date) VALUES ('浆果', 22.3, '2022-08-15');
1
2
# replace 语句
在MySQL
中,如果带插入的数据行中包含与已有数据行相同的主键值(primary key)
或unique
列值,那么insert
语句将无法插入成功,而只能使用replace
语句才能插入成功。
如果只是为了修改数据,我们并不建议使用replace
语句这种方式,而是推荐使用后面介绍的update
语句。
REPLACE INTO fruit (type, season, price, date, name)
VALUES ('浆果', '夏', 22.3, '2022-08-15','蓝莓');
1
2
2
# 更新数据:update
在MySQL
中,我们可以使用update
语句来对一张表进行更新数据。所谓的更新数据,也就是对已有的数据进行修改。
update 表名
set 列名 = 值;
1
2
2
如果没有
where
子句,update
语句会作用于整列中的所有记录
update fruit
set date = '2022-08-16';
where name = '蓝莓'
1
2
3
2
3
# 删除数据:delete
在MySQL
中,我们可以使用delete
语句来删除一张表中的部分或全部数据。
delete from 表名
where 条件;
1
2
2
如果想要一次性删除一个表中的所有数据,我们其实有两种方式可以实现。
-- 方式1
-- 如果不指定 WHERE 子句,DELETE 会删除表中的所有行
delete from fruit;
-- 方式2
truncate table fruit;
1
2
3
4
5
6
2
3
4
5
6
# 性能
- DELETE:逐行删除数据,并且在每删除一行时都会记录日志。如果表中有触发器
(Triggers)
,它们会在每删除一行时被触发。因此,DELETE
可能会比较慢,尤其是在有大量数据的大表上。 - TRUNCATE:是一种
DDL
(数据定义语言)操作,而不是DML
(数据操作语言)操作。它直接释放数据页并重置表,通常比DELETE
快得多,因为它不记录每一行的删除操作,并且不会触发触发器。
# 事务处理
- DELETE:可以在事务中使用。你可以使用
COMMIT
和ROLLBACK
来控制事务的提交和回滚。 - TRUNCATE:在大多数存储引擎(如
InnoDB
)中,TRUNCATE
也是一个隐式提交操作,即执行TRUNCATE
后,之前的事务会自动提交,并且不能回滚。