MYSQL插入处理重复键值的几种方法

时间:2024-01-22 05:41:28 

先建立2个测试表,在id列上创建unique约束。
mysql> create table test1(id int,name varchar(5),type int,primary key(id));
Query OK, 0 rows affected (0.01 sec)
mysql> create table test2(id int,name varchar(5),type int,primary key(id));
Query OK, 0 rows affected (0.01 sec)
mysql> select * from test1;
+-----+------+------+
| id  | name | type |
+-----+------+------+
| 101 | aaa  |    1 |
| 102 | bbb  |    2 |
| 103 | ccc  |    3 |
+-----+------+------+
3 rows in set (0.00 sec)
mysql> select * from test2;
+-----+------+------+
| id  | name | type |
+-----+------+------+
| 201 | aaa  |    1 |
| 202 | bbb  |    2 |
| 203 | ccc  |    3 |
| 101 | xxx  |    5 |
+-----+------+------+
4 rows in set (0.00 sec)
1、REPLACE INTO
发现重复的先删除再插入,如果记录有多个字段,在插入的时候如果有的字段没有赋值,那么新插入的记录这些字段为空。
mysql> replace into test1(id,name)(select id,name from test2);
Query OK, 5 rows affected (0.04 sec)
Records: 4  Duplicates: 1  Warnings: 0
mysql> select * from test1;
+-----+------+------+
| id  | name | type |
+-----+------+------+
| 101 | xxx  | NULL |
| 102 | bbb  |    2 |
| 103 | ccc  |    3 |
| 201 | aaa  | NULL |
| 202 | bbb  | NULL |
| 203 | ccc  | NULL |
+-----+------+------+
6 rows in set (0.00 sec)
需要注意的是,当你replace的时候,如果 * 入的表如果没有指定列,会用NULL表示,而不是这个表原来的内容。如果插入的内容列和 * 入的表列一样,则不会出现NULL。例如
mysql> replace into test1(id,name,type)(select id,name,type from test2);
Query OK, 8 rows affected (0.04 sec)
Records: 4  Duplicates: 4  Warnings: 0
mysql> select * from test1;
+-----+------+------+
| id  | name | type |
+-----+------+------+
| 101 | xxx  |    5 |
| 102 | bbb  |    2 |
| 103 | ccc  |    3 |
| 201 | aaa  |    1 |
| 202 | bbb  |    2 |
| 203 | ccc  |    3 |
+-----+------+------+
6 rows in set (0.00 sec)
如果INSERT的时候,需要保留 * 入表的列,只更新指定列,那么就可以使用第二种方法。
2、INSERT INTO ON DUPLICATE KEY UPDATE
发现重复的是更新操作。在原有记录基础上,更新指定字段内容,其它字段内容保留。例如我只想插入test2表的id,name字段,但是要保留test1表的type字段:
mysql> insert into test1(id,name,type)(select id,name,type from test2) on DUPLICATE KEY UPDATE test1.name=test2.name;
Query OK, 5 rows affected (0.04 sec)
Records: 4  Duplicates: 1  Warnings: 0
mysql> select * from test1;
+-----+------+------+
| id  | name | type |
+-----+------+------+
| 101 | xxx  |    1 |
| 102 | bbb  |    2 |
| 103 | ccc  |    3 |
| 203 | ccc  |    3 |
| 202 | bbb  |    2 |
| 201 | aaa  |    1 |
+-----+------+------+
6 rows in set (0.00 sec)
如果INSERT的时候,只想插入原表没有的数据,那么可以使用第三种方法。
3、IGNORE INTO
判断是否存在,存在不插入,否则插入。很容易理解,当插入的时候,违反唯一性约束,MySQL不会尝试去执行这条语句。例如:
mysql> insert ignore into test1(id,name,type)(select id,name,type from test2);
Query OK, 3 rows affected (0.01 sec)
Records: 4  Duplicates: 1  Warnings: 0
mysql> select * from test1;
+-----+------+------+
| id  | name | type |
+-----+------+------+
| 101 | aaa  |    1 |
| 102 | bbb  |    2 |
| 103 | ccc  |    3 |
| 203 | ccc  |    3 |
| 202 | bbb  |    2 |
| 201 | aaa  |    1 |
+-----+------+------+
6 rows in set (0.00 sec)

标签:MYSQL,重复键值
0
投稿

猜你喜欢

  • oracle数据库下统计专营店的男女数量的语句

    2012-07-11 16:01:17
  • js打开新窗口方法整理

    2024-04-10 16:13:05
  • 从git仓库中删除.idea文件夹的小妙招

    2022-10-29 04:12:00
  • python读写修改Excel之xlrd&xlwt&xlutils

    2022-04-03 16:35:43
  • django url到views参数传递的实例

    2023-10-17 13:53:42
  • 如何基于python对接钉钉并获取access_token

    2023-11-27 04:25:07
  • python网络爬虫 CrawlSpider使用详解

    2023-03-19 21:12:56
  • MySQL分区之KEY分区详解

    2024-01-26 16:24:54
  • 使用get方式提交表单在地址栏里面不显示提交信息

    2024-06-05 09:35:10
  • 两种oracle创建字段自增长的实现方式

    2024-01-15 09:47:44
  • Sqlserver 2000/2005/2008 的收缩日志方法和清理日志方法

    2012-07-21 14:55:18
  • HTML+CSS+JS实现完美兼容各大浏览器的TABLE固定列

    2024-04-29 13:38:31
  • Python中is与==的使用区别详解

    2023-10-15 04:08:21
  • python得到qq句柄,并显示在前台的方法

    2021-10-08 12:44:30
  • windows下Mysql多实例部署的操作方法

    2024-01-19 16:33:11
  • 如何利用python查找电脑文件

    2022-02-16 18:30:37
  • 如何跨浏览器使用连续字符的换行

    2008-07-06 23:10:00
  • PyTorch 之 强大的 hub 模块和搭建神经网络进行气温预测

    2022-11-11 14:41:15
  • ul设置浮动后不能自适应高度

    2011-01-25 12:48:00
  • centos7上mysql8.0rpm方式安装教程图解

    2024-01-13 06:23:59
  • asp之家 网络编程 m.aspxhome.com