Mysql之多种-Insert语句

mysql常用命令与数据导入导出中记录过常用的sql语句,其中包括了插入语句.

今天单独记录一下mysql的插入语句的更多用法.

本文测试使用数据库

数据库建表语句及当前的数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

mysql> show create table student;
+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| student | CREATE TABLE `student` (
`name` varchar(45) NOT NULL COMMENT '姓名',
`classNum` int(11) NOT NULL COMMENT '班级号',
PRIMARY KEY (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> select * from student;
+-----------+----------+
| name | classNum |
+-----------+----------+
| hublanker | 5 |
| huyanshi | 5 |
| test1 | 10 |
+-----------+----------+
3 rows in set (0.00 sec)

1.insert into

这是最常用的插入语句,具体示例如下:

1
insert into student(name,classNum) values("test2",20);

在数据库中成功插入了一条:名字为test2,班级为20的数据.

在使用insert into的时候,经常会有一个问题,就是主键冲突怎么办?

在数据库中插入主键重复的数据,会导致出错,如下:

1
2
3
mysql> insert into student(name,classNum) values("test2",20);
ERROR 1062 (23000): Duplicate entry 'test2' for key 'PRIMARY'
mysql>

那么重复的值我们需要制定一些策略,这就用到了下面两个语句.

replace into

当主键重复时,我们想不要报错,用新的数据替换掉旧的数据.

可以使用replace语句,示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
mysql> select * from student;
+-----------+----------+
| name | classNum |
+-----------+----------+
| hublanker | 5 |
| huyanshi | 5 |
| test1 | 10 |
| test2 | 20 |
+-----------+----------+
4 rows in set (0.00 sec)

mysql> replace into student(name,classNum) values("test2",21);
Query OK, 2 rows affected (0.00 sec)

mysql> select * from student;
+-----------+----------+
| name | classNum |
+-----------+----------+
| hublanker | 5 |
| huyanshi | 5 |
| test1 | 10 |
| test2 | 21 |
+-----------+----------+
4 rows in set (0.00 sec)

我们试图插入一条name=test2,classNum=21的数据,但是test2在数据库中主键已经存在,那么使用replace语句执行插入后,会发现,主键为test2的值仍然存在,但是classNum替换为了21.

insert ignore into

当主键重复时,有些场景下我们想不要报错,忽略掉新的数据就好.

这种情形下我们可以使用insert ignore into语句,示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
mysql> select * from student;
+-----------+----------+
| name | classNum |
+-----------+----------+
| hublanker | 5 |
| huyanshi | 5 |
| test1 | 10 |
| test2 | 21 |
+-----------+----------+
4 rows in set (0.00 sec)

mysql> insert ignore into student(name,classNum) values("test2",22);
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> select * from student;
+-----------+----------+
| name | classNum |
+-----------+----------+
| hublanker | 5 |
| huyanshi | 5 |
| test1 | 10 |
| test2 | 21 |
+-----------+----------+
4 rows in set (0.00 sec)

我们试图向数据库中插入一条name=test2,classNum=22的数据,但是test2主键已经存在,那么此条插入语句被忽略掉,可以看到在执行该语句前后,数据库的值没有任何变化.

总结

在日常测试机生产中,面对各种各样的情形,我们可以灵活使用上面几种插入语句,来达到我们的目的.





ChangeLog

2018-12-16 完成

以上皆为个人所思所得,如有错误欢迎评论区指正。

欢迎转载,烦请署名并保留原文链接。

联系邮箱:huyanshi2580@gmail.com

更多学习笔记见个人博客——>呼延十