如果你指定了ON DUPLICATE KEY UPDATE命令语句,那么在唯一索引或者主索引的作用下将插入与数据库记录重复的内容,但同时会更新数据库中的旧记录。例如,字段a被声明为唯一索引并且里面只包含有值为1的记录,以下两个语句会达到同样的效果:

一、INSERTINTOtable(a,b,c)VALUES(1,2,3)
   ONDUPLICATEKEYUPDATEc=c+1;

二、UPDATEtableSETc=c+1WHEREa=1;

受影响的是a=1的行,当插入时c的值加1。
如果字段b也是唯一的话,这个插入语句将和以下语句的效果一样:
UPDATE table SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;
如果a=1 OR b=2匹配了不止一行,也只是第一行被更新。一般地,如果表中有多个唯一索引的话,你应该避免在使用用ON DUPLICATE KEY子句。
你可以在插入更新语句 INSERT ... UPDATE 中使用 VALUES(字段名) 函数去关联某一行记录。也就是说, VALUES(字段名) 可以用在UPDATE语句中去更新某字段的值而会出现重复键。这个函数在多行插入中尤其有用。但是函数 VALUES() 仅当用在 INSERT ... UPDATE 语句中才有意义,否则会返回NULL。例如:

INSERTINTOtable(a,b,c)VALUES(1,2,3),(4,5,6)
ONDUPLICATEKEYUPDATEc=VALUES(a)+VALUES(b);

这个语句和下面两个是同效果的:

INSERTINTOtable(a,b,c)VALUES(1,2,3)
ONDUPLICATEKEYUPDATEc=3;
INSERTINTOtable(a,b,c)VALUES(4,5,6)
ONDUPLICATEKEYUPDATEc=9;

如果表中包含有一个自动递增字段AUTO_INCREMENT,并用 INSERT ... UPDATE 插入一行,函数 LAST_INSERT_ID()会返回AUTO_INCREMENT的值,如果这个语句更新某一行, LAST_INSERT_ID() 就没有意义了。但是,你可以通过用 LAST_INSERT_ID(expr)使它变得有意义,假如id字段是自动递增栏的话,使 LAST_INSERT_ID() 对更新语句有意义的方法如下:

INSERTINTOtable(a,b,c)VALUES(1,2,3)
ONDUPLICATEKEYUPDATEid=LAST_INSERT_ID(id), c=3;

如果你使用 ON DUPLICATE KEY UPDATE 语句的话,延迟执行选项 DELAYED 将被忽略。

英文原文地址:http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

其它声音:

插入记录

Insert into table_name (field_name1, field_name2, …) values (value1, value2, …);

Insert into values (value1, value2, …);   //这种形式只能应用于值的顺序与字段顺序匹配的情况(可以通过调用describe命令来决定字段顺序)。
包含引用标志的值需要再引号’前面加上反斜线                   //转义字符
注意:into 关键字是可选的
也可以同时插入多个值,用逗号分开
Eg:insert table_name values (value1, value2, …), (value3, value4, …);
还可以不使用insert… values格式,而使用类似update语句,它使用set子句分别为每一列设置值。
Insert into table_name set field_name1 = value1, field_name2 = value2,…;
使用default值
Create table table_name (field_name1 type default def_value not null,…);
Insert table_name values (default,…);   //default关键字只在4.0.3以及更高版本才支持
使用AUTOINCREMENT字段
自动产生下一个序号,该字段必须被设置为主键
使用UNIQUE字段
使用IGNORE关键字或者ON DUPLICATE KEY UPDATE子句跳过INSERT、中断操作或者更新旧记录为新值。
INSERT IGNORE INTO TABLE_NAME (UNIQUE_FIELD, …) VALUES (REPEAT, …);
如果重复记录,则不会报告错误,也不会更新记录,数据库中的数据保持不变。
ON DUPLICATE KEY UPDATE和REPLACE区别:前者只把已命名的字段更新为新值,后者删除了旧记录,然后用新值完全替换。
Eg:insert into Menu value (null, ‘MySQL’, ‘www.mysql.com’) on duplicate key update label=’MS SQL’, url=’www.microsoft.com’;
在这种情况下,如果MySQL发现表中已经包含具有相同唯一键的记录,则会自动更新旧的记录为ON DUPLICATE KEY UPDATE从句中指定的新值。
当有很多insert语句需要被顺序执行时,IGNORE关键字就使操作变得很方便。这可以保证不管拿一个INSERT包含了重复值,MySQL都会跳过而不放弃全部操作。

MYSQL 无重复插入数据更新语法 sql一句话使insert时若主键重复则更新相关推荐

  1. 使用mybatis插入数据(insert)时返回主键的问题

    使用mybatis做插入操作时,想要获取新增记录的主键,我发现现在的方式和以前的方式有所区别,即以前是直接通过方法返回,现在是将主键设置在数据实体对象中. 下面对mybatis进行insert时返回主 ...

  2. SQL Server2000导出数据时包含主键、字段默认值、描述等信息

    时经常用SQL Server2000自带的导出数据向导将数据从一台数据库服务器导出到另一台数据库服务器: 结果数据导出了,但表的主键.字段默认值.描述等信息却未能导出,一直没想出什么方法,今天又尝试了 ...

  3. sql当等INSERT之后获取主键值

    SQL   SERVER   2000   中的标识值获取函数       IDENTITY(标识)列,也有很多人称之为自增列,在SQL   Server   2000中,标识列通过IDENTITY来 ...

  4. springboot 主键重复导致数据重复_程序员:MySQL处理插入过程中主键或唯一键重复值的解决办法

    向MySQL插入数据有时会遇到主键重复的场景,原来的做法是先在程序代码中SELECT一下,判断是否存在指定主键或唯一键的数据,如果没有则插入,有的话则执行UPDATE操作,或另外一套逻辑,这种方法是不 ...

  5. mysql不能写重复键_mysql主键重复,不抱错,只更新的骚操作 (如果没有插入,如果有更新)...

    平时我们在设计数据库表的时候总会设计 unique  或者 给表加上 primary key 的限制条件. 此时 插入数据的时候 ,经常会有这样的情况: 我们想向数据库插入一条记录: 若数据表中存在以 ...

  6. mysql主键可以重复吗_mysql 处理主键重复

    select * from stock; -- 1.批量插入,忽略主键重复的数据 insert IGNORE into insert IGNORE into `stock` (`id`,`name`, ...

  7. mysql update主键冲突_mysql主键重复,不报错,只更新的操作

    项目中对接一个单点登陆的回调api,需要判断用户是否在库,不在库新增用户,在库更新登陆次数,大概代码如下:<?php $isExist = true; if ($isExist) { inser ...

  8. mysql 主键重复问题解决 Duplicate entry '787192513' for key 'PRIMARY'

    Mysql导入大量数据时,会报如下错误,主键重复,不能再继续执行. Query: INSERT INTO `FNDCN_MNG` VALUES(787390578, 1, '杨明', 95585, ' ...

  9. MySQL主键重复问题解决 Duplicate entry '787192513' for key 'PRIMARY'

    Mysql导入大量数据时,会报如下错误,主键重复,不能再继续执行. Query: INSERT INTO `FNDCN_MNG` VALUES(787390578, 1, '杨明', 95585, ' ...

  10. 数仓工具—Hive语法之连续full join主键重复(24)

    文章目录 连续full join 主键重复 问题复现 Hive 版本的问题 执行顺序的问题 写法有问题 解决方案 严格限制关联条件顺序 合并去重 关联coalesce 总结 连续full join 主 ...

最新文章

  1. Linux下yum方式安装mysql 以及卸载mysql
  2. PetShop的系统架构设计[转]
  3. PostgreSQL下如何修改用户权限的介绍以及hook机制对超级用户的权限修改
  4. 自定义parallelStream的thread pool
  5. 20145122《Java面向对象程序设计》实验二实验报告
  6. 职业技术人士学习捷径最快的网站
  7. 在Windows平台上安装Dubbox框架
  8. IE下检测泄露的全局变量
  9. 64位系统装32和64位oracle,64位系统安装32位Oracle developer
  10. javaweb项目通过F5负载,获取客户端真实ip
  11. 用户态与内核态之间的切换
  12. 乐观锁实现接口幂等性_calvin-idempotent
  13. dubbo中 provider和 comsumer端timeout的设置区别
  14. Python数据分析之股票双均线策略制定
  15. Vue 路由懒加载和动态加载
  16. Oracle EBS 工具栏按钮失效
  17. TMT: A Transformer-based Modal Translator for Improving Multimodal Sequence Representations in Audio
  18. 4、项目融资 - 打造企业上市系列文章
  19. 《驯服烂代码》第一章
  20. web字体库加载优化_优化Web字体以提高性能:最新技术

热门文章

  1. C#把Xml转换为DataSet的两种方法
  2. 用 BAT 注册 Subversion 服务
  3. CentOS linux系统将UTC时间修改为CST时间
  4. LayaAir2.0 内置函数
  5. maven整合ssh框架笔记
  6. (转)Linux 系统性能分析工具图解读(一、二)
  7. 出师表 / 前出师表 作者:诸葛亮
  8. 自然语言处理----词干提取器
  9. 单点登录相关问题总结
  10. SP2010开发和VS2010专家食谱--第七章节--使用客户端对象模型