文章目录
- MySQL的增删查改① - 增
- 1.发生冲突则失败
- 1.1 基本语法
- 1.2 单行数据+全列插入
- 1.3 多行数据 + 指定列插入
- 2.发生冲突则更新
- 2.1 基本语法
- 2.2 插入否则更新
- 3.发生冲突则替换
- 3.1 基本语法
- 3.2插入否则替换
- 4.插入查询结果
MySQL的增删查改① - 增
-- 创建一张学生表
CREATE TABLE students (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
sn INT NOT NULL UNIQUE COMMENT '学号',
name VARCHAR(20) NOT NULL,
qq VARCHAR(20)
);
增加记录的实验都将在students表上进行,students表的结构如上图所示。
1.发生冲突则失败
1.1 基本语法
🎯[语法]:
INSERT [INTO] table_name [(column [, column] ...)] VALUES (value_list) [, (value_list)] ...
📝[说明]:
-
[]中的内容是可以省略的,如下:
insert students values (0, 10000, '唐三藏', NULL);
-
在插入数据的时候,values中的值是与column前后一一对应的。如果column省略,则表示全列插入——给所有列依次插入
-
insert语句一次可以插入多条记录,记录间用逗号隔开
INSERT INTO students (id, sn, name) VALUES (102, 20001, '曹孟德'), (103, 20002, '孙仲谋');
-
当主键或者唯一键的唯一性发生冲突时(即插入重复的记录时),插入操作失败
下面为大家一些具体的使用案例:
1.2 单行数据+全列插入
mysql> insert into students values(1, 10000, '唐三藏', '123456');
Query OK, 1 row affected (0.01 sec)
mysql> insert into students values(2, 10001, '孙悟空', '1234567');
Query OK, 1 row affected (0.00 sec)
mysql> select * from students;
+----+-------+-----------+---------+
| id | sn | name | qq |
+----+-------+-----------+---------+
| 1 | 10000 | 唐三藏 | 123456 |
| 2 | 10001 | 孙悟空 | 1234567 |
+----+-------+-----------+---------+
2 rows in set (0.00 sec)
1.3 多行数据 + 指定列插入
mysql> insert into students(sn, name) values(10002, '曹孟德'),(10003, '孙仲谋');
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from students;
+----+-------+-----------+---------+
| id | sn | name | qq |
+----+-------+-----------+---------+
| 1 | 10000 | 唐三藏 | 123456 |
| 2 | 10001 | 孙悟空 | 1234567 |
| 3 | 10002 | 曹孟德 | NULL |
| 4 | 10003 | 孙仲谋 | NULL |
+----+-------+-----------+---------+
4 rows in set (0.00 sec)
📌[注意]:
- insert语句可以一次插入多条记录,各条记录间用逗号分隔。
- 更加推荐使用指定列插入,这样就算表的结构改变了(比如增加了一个邮箱字段),我们的sql语句也不会受影响
2.发生冲突则更新
2.1 基本语法
🎯[语法]:
INSERT ... ON DUPLICATE KEY UPDATE column = value [, column = value]
📝[说明]:
- 由于 主键 或者 唯一键 对应的值已经存在而导致插入失败,可以选择性的进行同步更新操作,即对指定列的值进行修改
2.2 插入否则更新
mysql> select * from students;
+----+-------+-----------+---------+
| id | sn | name | qq |
+----+-------+-----------+---------+
| 1 | 10000 | 唐三藏 | 123456 |
| 2 | 10001 | 孙悟空 | 1234567 |
| 3 | 10002 | 曹孟德 | NULL |
| 4 | 10003 | 孙仲谋 | NULL |
+----+-------+-----------+---------+
4 rows in set (0.00 sec)
-- 主键发生冲突,进行更新操作
mysql> insert into students(id, sn, name) values(1, 10000, '唐僧')
-> on duplicate key update sn=9999, name='唐僧';
Query OK, 2 rows affected (0.00 sec)
mysql> select * from students;
+----+-------+-----------+---------+
| id | sn | name | qq |
+----+-------+-----------+---------+
| 1 | 9999 | 唐僧 | 123456 |
| 2 | 10001 | 孙悟空 | 1234567 |
| 3 | 10002 | 曹孟德 | NULL |
| 4 | 10003 | 孙仲谋 | NULL |
+----+-------+-----------+---------+
4 rows in set (0.00 sec)
-- 没有发生冲突,正常插入
mysql> insert into students(id, sn, name) values(5, 10000, '唐僧')
-> on duplicate key update id = 6, sn=9999, name='唐长老';
Query OK, 1 row affected (0.01 sec)
mysql> select * from students;
+----+-------+-----------+---------+
| id | sn | name | qq |
+----+-------+-----------+---------+
| 1 | 9999 | 唐僧 | 123456 |
| 2 | 10001 | 孙悟空 | 1234567 |
| 3 | 10002 | 曹孟德 | NULL |
| 4 | 10003 | 孙仲谋 | NULL |
| 5 | 10000 | 唐僧 | NULL |
+----+-------+-----------+---------+
5 rows in set (0.00 sec)
📌[注意]:
- 当插入数据
(1, 10000, '唐僧')
时,主键id发生冲突,因此对原记录进行选择性修改 - 当插入数据
(5, 10000, '唐僧')
时,没有发生冲突,则正常插入
3.发生冲突则替换
3.1 基本语法
🎯[语法]:
REPLACE INTO students [(column [, column] ...)] VALUES (value_list) [, (value_list)] ...
📝[说明]:
-
主键、唯一键没有发生冲突,则直接插入数据
-
发生冲突,则删除原始数据后再插入(即替换的效果)
3.2插入否则替换
mysql> select * from students;
+----+-------+-----------+---------+
| id | sn | name | qq |
+----+-------+-----------+---------+
| 1 | 9999 | 唐僧 | 123456 |
| 2 | 10001 | 孙悟空 | 1234567 |
| 3 | 10002 | 曹孟德 | NULL |
| 4 | 10003 | 孙仲谋 | NULL |
| 5 | 10000 | 唐僧 | NULL |
+----+-------+-----------+---------+
5 rows in set (0.00 sec)
-- 主键发生冲突则进行替换
mysql> replace into students(id, sn, name, qq) values(5, 10004, '刘玄德', '666666');
Query OK, 2 rows affected (0.01 sec)
-- 没有发生主键冲突则直接插入
mysql> replace into students(id, sn, name, qq) values(6, 10005, '关云长', '888888');
Query OK, 1 row affected (0.00 sec)
mysql> select * from students;
+----+-------+-----------+---------+
| id | sn | name | qq |
+----+-------+-----------+---------+
| 1 | 9999 | 唐僧 | 123456 |
| 2 | 10001 | 孙悟空 | 1234567 |
| 3 | 10002 | 曹孟德 | NULL |
| 4 | 10003 | 孙仲谋 | NULL |
| 5 | 10004 | 刘玄德 | 666666 |
| 6 | 10005 | 关云长 | 888888 |
+----+-------+-----------+---------+
6 rows in set (0.00 sec)
📌[注意]:
- 插入数据
5, 10004, '刘玄德', '666666'
时,主键发生冲突,因此先删除表中原先冲突的数据,再将数据插入。所以我们会看到 “2 rows affected” - 插入数据
6, 10005, '关云长', '888888'
时没有发生冲突,则直接插入。我们也不难理解为什么是“1 row affected” - 如果插入的数据与多行数据都有冲突,那么所有冲突的记录都会被删除
4.插入查询结果
INSERT 还支持将查询结果插入到一张表中:
-
快速创建一张和现有表结构相同的表
create table t1 like t2 -- 只会靠别表结构,不会拷贝数据
-
将一张表中的搜索结果插入到另一张表中
-- 将表for_duplicate去重后的数据插入到 duplicate 中 mysql> insert into for_duplicate values(1, 'aa'), (1, 'aa'), (2, 'bb'), (2, 'bb'); Query OK, 4 rows affected (0.00 sec) Records: 4 Duplicates: 0 Warnings: 0 mysql> insert into duplicate select distinct * from for_duplicate; Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> select * from duplicate; +------+------+ | id | name | +------+------+ | 1 | aa | | 2 | bb | +------+------+ 2 rows in set (0.00 sec)