MySQL 记录不存在时插入 记录存在则更新的实现方法

INSERT INTO table (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE c=c+1;

INSERT 中 ON DUPLICATE KEY UPDATE的使用 
如果指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则执行旧行UPDATE。例如,如果列a被定义为UNIQUE,并且包含值1,则以下两个语句具有相同的效果:mysql> INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=c+1; mysql> UPDATE table SET c=c+1 WHERE a=1; 
如果行作为新记录被插入,则受影响行的值为1;如果原有的记录被更新,则受影响行的值为2。 
注释:如果列b也是唯一列,则INSERT与此UPDATE语句相当: 
mysql> UPDATE table SET c=c+1 WHERE a=1 OR b=2 LIMIT 1; 如果a=1 OR b=2与多个行向匹配,则只有一个行被更新。通常,您应该尽量避免对带有多个唯一关键字的表使用ON DUPLICATE KEY子句。 可以在UPDATE子句中使用VALUES(col_name)函数从INSERT...UPDATE语句的INSERT部分引用列值。换句话说,如果没有发生重复关键字冲突,则UPDATE子句中的VALUES(col_name)可以引用被插入的col_name的值。本函数特别适用于多行插入。
VALUES()函数只在INSERT...UPDATE语句中有意义,其它时候会返回NULL。 
示例: 
mysql> INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b); 
本语句与以下两个语句作用相同: 
mysql> INSERT INTO table (a,b,c) VALUES (1,2,3) 
         -> ON DUPLICATE KEY UPDATE c=3; 
mysql> INSERT INTO table (a,b,c) VALUES (4,5,6) 
         -> ON DUPLICATE KEY UPDATE c=9;  

INSERT ... SELECT

INSERT ... ON DUPLICATE KEY UPDATE

INSERT ... ON DUPLICATE REPLACE

MySQL 记录不存在时插入 记录存在则更新的实现方法

时间: 2024-10-19 09:28:05

MySQL 记录不存在时插入 记录存在则更新的实现方法的相关文章

【转】MySQL数据表中记录不存在则插入,存在则更新

mysql 记录不存在时插入在 MySQL 中,插入(insert)一条记录很简单,但是一些特殊应用,在插入记录前,需要检查这条记录是否已经存在,只有当记录不存在时才执行插入操作,本文介绍的就是这个问题的解决方案. 问题:我创建了一个表来存放客户信息,我知道可以用 insert 语句插入信息到表中,但是怎么样才能保证不会插入重复的记录呢? 答案:可以通过使用 EXISTS 条件句防止插入重复记录. 示例一:插入多条记录 假设有一个主键为 client_id 的 clients 表,可以使用下面的

MySQL 当记录不存在时插入(insert if not exists)

在 MySQL 中,插入(insert)一条记录很简单,但是一些特殊应用,在插入记录前,需要检查这条记录是否已经存在,只有当记录不存在时才执行插入操作,本文介绍的就是这个问题的解决方案.问题:我创建了一个表来存放客户信息,我知道可以用 insert 语句插入信息到表中,但是怎么样才能保证不会插入重复的记录呢?答案:可以通过使用 EXISTS 条件句防止插入重复记录.示例一:插入多条记录 假设有一个主键为 client_id 的 clients 表,可以使用下面的语句:Code: INSERT I

mysql妙用:批量插入记录,遇到重复记录则为自动更新

在更新大量数据时可能同时遇到两个问题: 如果每条更新执行一次sql性能很低,也容易造成阻塞: 批量更新时又有可能遇到主键重复的问题 使用 ON DUPLICATE KEY UPDATE 一条sql解决批量更新和主键重复问题(id为主键) INSERT INTO mytable(id,pid,ele,anim)  VALUES (?,?,?,?),(?,?,?,?),(?,?,?,?) ON DUPLICATE KEY UPDATE pid=VALUES(pid),ele=VALUES(ele)

mysql cluster 集群时插入大量数据出现 table is full的解决方法

一.循环插入数据时出现  table is full 二.在mgm>all report memoryusage 查看 Node 2: Data usage is 22%(2305 32K pages of total 10240) 使用率到最后98%以上这时出现啦table is full 基于以上两种情况,其实是一种情况的我的解决方法是: 根据硬件配置必须根据硬件配置修改my.cnf文件和config.ini文件 1.config.ini[ndbd default]NoOfReplicas=

myeclipse连接mysql生成数据表时中文字符乱码或问号(解决方法)

出现这个问题有以下三步解决思路: 1. 检查myeclipse的编码格式 windows---->Preferences---->general---->Workspace,右侧窗口Text file encoding,选择Other,改变为UTF-8. 此时刷新项目,看能否正常写入中文字符. 2. 检查数据库的编码格式 我用sqlyog连接的数据库,先在询问窗口查询一下编码格式: SHOW VARIABLES LIKE 'character_set_%';结果如下: 检查图中的几项是否

《Mysql - 在Mysql服务出现瓶颈时,有哪些“饮鸩止渴”提高性能的方法?》

一:情景 - 业务高峰期,生产环境的 MySQL 压力太大,没法正常响应,需要短期内.临时性地提升一些性能. - 在业务高发时候,Mysql 服务压力过大,导致业务受损, 用户的开发负责人说,不管你用什么方案,让业务先跑起来再说. - 今天我们就来聊聊这些临时方案,并着重说一说它们可能存在的风险.(有损方案,无损方案肯定不会再这个时候才执行) 二:短连接导致的性能问题 - 为什么短连接会引起数据库的性能问题? - 正常的短连接模式就是连接到数据库后,执行很少的 SQL 语句就断开,下次需要的时候

MyBatis获取插入记录的自增长字段值

第一步: 在Mybatis Mapper文件中添加属性“useGeneratedKeys”和“keyProperty”,其中keyProperty是Java对象的属性名! <insert id="insert" parameterType="Spares" useGeneratedKeys="true" keyProperty="id"> insert into spares(spares_id,spares_na

Mysql 插入记录时检查记录是否已经存在,存在则更新,不存在则插入记录SQL

我们在开发数据库相关的逻辑过程中, 经常检查表中是否已经存在这样的一条记录, 如果存在则更新或者不做操作, 如果没有存在记录,则需要插入一条新的记录. 这样的逻辑固然可以通过两条sql语句完成. SELECT COUNT(*) FROM xxx WHERE ID=xxx; if (x == 0) INSERT INTO xxx VALUES; else UPDATE xxx SET ; 但是这样操作在性能上有所损失, 代码结构感觉有点丑陋. 其实MySQL提供了可以在一个SQL语句中完成上述逻辑

MyBatis 插入时返回刚插入记录的主键值

MyBatis 插入时返回刚插入记录的主键值 一.要求: 1.数据库表中的主键是自增长的,如:id: 2.获取刚刚插入的记录的id值: 二.源代码: 1.User.java 1 package cn.com.zfc.model; 2 3 public class User { 4 5 private Integer id; 6 private String name; 7 private String password; 8 9 public Integer getId() { 10 retur