热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

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

MYSQL插入处理重复键值的几种方法当unique列在一个UNIQUE键上插入包含重复值的记录时,默认insert的时候会报1062错误,MYSQL有三种不同的处理方法,下面我们分别介绍。先建立2个测试表,在id列上创建unique约束。...SyntaxHighlighter.

MYSQL插入处理重复键值的几种方法
 
当unique列在一个UNIQUE键上插入包含重复值的记录时,默认insert的时候会报1062错误,MYSQL有三种不同的处理方法,下面我们分别介绍。 
先建立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)   www.2cto.com  
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; 
+-----+------+------+   www.2cto.com  
| 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; 
+-----+------+------+   www.2cto.com  
| 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;   www.2cto.com  
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   www.2cto.com  
判断是否存在,存在不插入,否则插入。很容易理解,当插入的时候,违反唯一性约束,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)

推荐阅读
  • 探讨一个老旧 PHP MySQL 系统中,时间戳字段不定期出现异常值的问题及其可能原因。 ... [详细]
  • 本文详细记录了在基于Debian的Deepin 20操作系统上安装MySQL 5.7的具体步骤,包括软件包的选择、依赖项的处理及远程访问权限的配置。 ... [详细]
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • 解决PHP与MySQL连接时出现500错误的方法
    本文详细探讨了当使用PHP连接MySQL数据库时遇到500内部服务器错误的多种解决方案,提供了详尽的操作步骤和专业建议。无论是初学者还是有经验的开发者,都能从中受益。 ... [详细]
  • 在哈佛大学商学院举行的Cyberposium大会上,专家们深入探讨了开源软件的崛起及其对企业市场的影响。会议指出,开源软件不仅为企业提供了新的增长机会,还促进了软件质量的提升和创新。 ... [详细]
  • 本文探讨了适用于Spring Boot应用程序的Web版SQL管理工具,这些工具不仅支持H2数据库,还能够处理MySQL和Oracle等主流数据库的表结构修改。 ... [详细]
  • 本文详细介绍了如何通过多种编程语言(如PHP、JSP)实现网站与MySQL数据库的连接,包括创建数据库、表的基本操作,以及数据的读取和写入方法。 ... [详细]
  • Windows 系统下 MySQL 8.0.11 的安装与配置
    本文详细介绍了在 Windows 操作系统中安装和配置 MySQL 8.0.11 的步骤,包括环境准备、安装过程以及后续配置,帮助用户顺利完成数据库的部署。 ... [详细]
  • 本文深入探讨了如何通过调整InnoDB的关键配置参数来优化MySQL的随机IO性能,涵盖了缓存、日志文件、预读机制等多个方面,帮助读者全面提升数据库系统的性能。 ... [详细]
  • 本文详细介绍如何下载并安装MySQL数据库(5.7.10版本),以及配置Navicat管理工具(免费版)。通过本指南,您将了解从下载到安装的完整流程,并掌握基本的数据库管理技能。 ... [详细]
  • MySQL中枚举类型的所有可能值获取方法
    本文介绍了一种在MySQL数据库中查询枚举(ENUM)类型字段所有可能取值的方法,帮助开发者更好地理解和利用这一数据类型。 ... [详细]
  • 本文探讨了在处理大量物联网设备时,如何合理设计关系型数据库来高效记录设备的上下线历史,确保数据的可维护性和扩展性。 ... [详细]
  • MySQL 用户创建失败的解决方案
    本文详细介绍了在 MySQL 中遇到用户创建失败问题时的解决方法,包括如何正确配置环境、执行命令以及常见错误排查技巧。通过逐步指导,帮助用户顺利添加和管理 MySQL 用户。 ... [详细]
  • 本文详细介绍了如何通过命令行启动MySQL服务,包括打开命令提示符窗口、进入MySQL的bin目录、输入正确的连接命令以及注意事项。文中还提供了更多相关命令的资源链接。 ... [详细]
  • 解读MySQL查询执行计划的详细指南
    本文旨在帮助开发者和数据库管理员深入了解如何解读MySQL查询执行计划。通过详细的解析,您将掌握优化查询性能的关键技巧,了解各种访问类型和额外信息的含义。 ... [详细]
author-avatar
记录生活点滴1988_234
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有