生产环境收集到bug,在小组管理员进行ban/unban小组成员操作时需要更改小组成员的状态(单独的一张表,大概为:小组id,成员id,状态,前两列组成联合主键),往该表插入数据行时数据库提示insert主键冲突。分析原因,可能是服务器抖动(概率很小,而且看日志的重复次数不像是服务器原因),也可能是两个小组的管理员都在执行同一个小组成员的insert操作,一先一后,后操作的执行失败。
可能的解决方法是,每次插入操作时执行一次查询操作,如果表中没有对应记录就执行insert,否则执行update,但这需要进行两次db操作。Mysq提供了insert...on duplicate key update操作,专门应付此问题。翻译一下Mysql官方文档:http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html
If you specify ON DUPLICATE KEY UPDATE, and a row is inserted that would cause a duplicate value in a UNIQUE index or PRIMARY KEY, an UPDATE of the old row is performed. For example, if column a is declared as UNIQUE and contains the value 1, the following two statements have identical effect:
如果你执行insert操作,并且insert操作会导致primary key或者unique列上的值重复,这时,指定ON DUPLICATE KEY UPDATE将会update原来的数据行。举个栗子,如果列a声明为UNIQUE且包含值1,则如下两个语句等效:
INSERT INTO table (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=c+1;
UPDATE table SET c=c+1 WHERE a=1;
The ON DUPLICATE KEY UPDATE clause can contain multiple column assignments, separated by commas.
ON DUPLICATE KEY UPDATE语句可包行多个赋值语句,使用逗号分隔开。
With ON DUPLICATE KEY UPDATE, the affected-rows value per row is 1 if the row is inserted as a new row and 2 if an existing row is updated.
使用ON DUPLICATE KEY UPDATE,如果数据行插入成功,则返回的受影响的行数为1;如果更新了老的数据行,返回的首影响行是2。
If column b is also unique, the INSERT is equivalent to this UPDATE statement instead:
如果列b同样声明为unique,INSERT语句等同于:
UPDATE table SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;
If a=1 OR b=2 matches several rows, only one row is updated. In general, you should try to avoid using an ON DUPLICATE KEY clause on tables with multiple unique indexes.
如果a=1 OR b=2匹配了多行,只有一行会被更新。一般来说,你应该避免使用ON DUPLICATE KEY 语句操作拥有多个unique列的表。
You can use the VALUES(col_name) function in the UPDATE clause to refer to column values from the INSERT portion of the INSERT ... UPDATE statement. In other words, VALUES(col_name) in the UPDATE clause refers to the value of col_name that would be inserted, had no duplicate-key conflict occurred. This function is especially useful in multiple-row inserts. The VALUES() function is meaningful only in INSERT ... UPDATE statements and returns NULL otherwise.
在INSERT...UPDATE语句里,你可以在UPDATE语句中使用VALUES(col_name)函数引用INSERT处的列值。也就是说,UPDATE 处的VALUES(col_name)函数,可以引用原本被插入列的值(如果没有DUPLICATE KEY)。该函数在执行多行插入时尤其有用,且只在INSERT...ON DUPLICATE KEY UPDATE语句中有意义,在其他情况下使用将返回NULL。
Example:
例子:
INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)
ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);
That statement is identical to the following two statements:
该语句等同于:
INSERT INTO table (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=3;
INSERT INTO table (a,b,c) VALUES (4,5,6)
ON DUPLICATE KEY UPDATE c=9;
If a table contains an AUTO_INCREMENT column and INSERT ... UPDATE inserts a row, the LAST_INSERT_ID() function returns the AUTO_INCREMENT value. If the statement updates a row instead, LAST_INSERT_ID() is not meaningful. However, you can work around this by using LAST_INSERT_ID(expr). Suppose that id is the AUTO_INCREMENT column. To make LAST_INSERT_ID() meaningful for updates, insert rows as follows:
如果表包含AUTO_INCREMENT列并且INSERT...UPDATE语句插入了新行,LAST_INSERT_ID()函数返回AUTO_INCREMENT值。反之,如果执行语句更新了一行,LAST_INSRET_ID()的返回值无意义。然而,你可以使用LAST_INSERT_ID(expr)函数取到值。假定id列声明为AUTO_INCREMENT,可在UPDATE中如此使用LAST_INSERT_ID()函数:
INSERT INTO table (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), c=3;
The DELAYED option is ignored when you use ON DUPLICATE KEY UPDATE.
发表评论
-
(ZZ)Oracle约束的关键字Enable/Disable/Validate/Novalidate
2015-09-16 11:34 7611 组合特性说明 Validate ... -
MySQL的权限
2014-07-09 17:49 550一.权限表 mysql数据 ... -
CentOS5.4安装源码MySQL5.5.38
2014-07-06 15:16 2248安装环境 系统 CentOS 5.4 ,安装系统时顺带安 ... -
(ZZ)MySQL日期时间函数大全
2014-03-21 14:32 696DAYOFWEEK(date) 返回 ... -
(ZZ)使用Percona Xtrabackup对数据库进行部分备份
2014-02-28 14:21 625今天同事问我用Xtrabackup工具怎么对某些表进行备份 ... -
mysql实现Oracle中row_number over partition by
2014-02-25 17:26 1250SELECT t1.empno,t1.sal,t1.dept ... -
根据生日计算年龄
2014-02-24 18:58 850select (year(now())-year('1 ... -
(ZZ)mysql创建定时任务
2014-02-17 19:55 583一、前言 自 MySQL5.1.6起,增加了一个非常有特色 ... -
(ZZ)提高MySQL效率与性能的技巧
2014-01-24 16:26 528今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于 ... -
MySQL 数据类型
2014-01-23 13:25 609MySQL 的数值数据类型可以大致划分为两个类别,一个是整数 ... -
(ZZ)phpMyAdmin设置mysql存储过程及其问题
2014-01-22 21:23 691这几天需要用到数据库,使用的是MySQL,数据库 ... -
(ZZ)MYSQL SQL_NO_CACHE的真正含义
2013-02-17 11:29 1227当我们想用SQL_NO_CACHE来禁止结果缓存时发现结果 ... -
(zz)skip-grant-tables:非常有用的mysql启动参数
2013-02-05 14:20 1033介绍一个非常有用的mysql启动参数—— --skip-gr ... -
前缀索引
2013-02-04 15:51 803应用场景: 数据库里有个地址(address)字段, ... -
mysql常用操作
2013-02-01 10:39 7521:打开mysql数据库 mysql -h主机地址 -u用 ... -
(ZZ)oracle与mysql的批量插入
2013-01-29 16:34 728oracle与mysql的批量插入 oracle 批量插入 ... -
(ZZ)MySQL主从复制
2012-12-12 11:17 775ysql主从复制原理: mysql的主从复制是一个异步复制的过 ... -
MySQL二进制日志备份和恢复
2012-12-11 10:56 942基本概念 定义: 二进 ... -
(ZZ)msyql索引类型
2012-11-27 16:36 912【转】http://hi.baidu.com/mesong1/ ... -
mysql的hibernate配置
2012-05-14 18:35 752<hibernate-configuratio ...
相关推荐
当你在`INSERT`语句后添加`ON DUPLICATE KEY UPDATE`,如果新插入的行违反了唯一性约束,MySQL将执行指定的`UPDATE`操作。这里的“唯一性”指的是任何具有唯一索引或主键的列。例如,如果你有一个名为`consume_locus...
ON DUPLICATE KEY UPDATE` 是 MySQL 数据库中的一种高效操作,它结合了插入新记录和更新已有记录的功能。这个语句主要用于处理唯一性约束冲突,如 PRIMARY KEY 或 UNIQUE 索引的情况。当试图插入的记录与现有记录在...
在MySQL数据库中,如果你需要执行一个操作,即当数据存在时进行更新,如果不存在则进行插入,你可以使用`INSERT INTO...ON DUPLICATE KEY UPDATE`语句。这个功能强大的语句结合了`INSERT`和`UPDATE`操作,允许你在...
ON DUPLICATE KEY UPDATE`这两种语句。这两种SQL语句可以帮助我们高效地处理数据冲突,避免繁琐的循环操作,提高数据库操作的效率。 首先,我们来看`REPLACE`语句。`REPLACE`类似于`INSERT`,但它会在检测到主键或...
- 示例中,当再次尝试`INSERT`一个`a=3`的记录时,由于`b`字段在`ON DUPLICATE KEY UPDATE`部分被指定更新为'r5',所以原有记录的`b`字段被更新,而`c`字段保持不变。 - 对于`AUTO_INCREMENT`字段,`INSERT INTO ....
INSERT INTO table(a, b, c) VALUES (1, 2, 3) ON DUPLICATE KEY UPDATE c = c + 1; UPDATE table SET c = c + 1 WHERE a = 1; ``` 当尝试插入的记录 `(1, 2, 3)` 中的 `a` 值已存在于表中时,`ON DUPLICATE KEY ...
在MySQL中,`REPLACE INTO` 和 `INSERT INTO ON DUPLICATE KEY UPDATE` 是两种处理数据插入时冲突的方法,主要用于处理当试图插入一条记录时,若已有相同唯一键值的记录存在,应该如何操作的情况。 1. **REPLACE ...
然而,`DELAYED`不适用于`INSERT...SELECT`和`INSERT...ON DUPLICATE KEY UPDATE`语句,且在主从复制环境中被忽略,因为它可能导致主从数据不一致。 2. **IGNORE**: `IGNORE`是MySQL的一个非标准扩展,它用于处理...
在MySQL数据库中,`ON DUPLICATE KEY UPDATE` 是一个非常实用的特性,它允许你在执行INSERT语句时,如果插入的数据违反了唯一性约束(即存在相同的唯一索引),则自动执行UPDATE操作来更新已有记录。这个功能在处理...
INSERT INTO ipstats VALUES('192.168.0.1', 1) ON DUPLICATE KEY UPDATE clicks=clicks+1; ``` 这将自动检测到`ip`列的唯一性约束,如果IP已存在,就更新`clicks`列,增加1次点击。 总结一下`ON DUPLICATE KEY ...
ON DUPLICATE KEY UPDATE` 和 `REPLACE INTO`。这两种方法都可以实现“合并”操作,即在保持唯一键约束的同时,对重复的数据进行更新。 首先,我们来看一下`INSERT INTO ... ON DUPLICATE KEY UPDATE` 语句。这个...
mysql “ON DUPLICATE KEY UPDATE” 语法如果在INSERT语句末尾指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则在出现重复值的行执行UPDATE;如果不会导致唯一值列...
INSERT INTO table_name (col1, col2, col3) VALUES (val1, val2, val3) ON DUPLICATE KEY UPDATE col1 = new_val1, col2 = new_val2, col3 = new_val3; 这个语句首先尝试插入数据,如果遇到唯一键冲突,就会执行...
MySQL中的主键与唯一索引约束是...使用InnoDB存储引擎可以确保事务安全和一致性,而`ON DUPLICATE KEY UPDATE`语句则提供了更高级的冲突处理能力。在进行数据库设计时,应充分利用这些特性来保证数据的准确性和一致性。
ON DUPLICATE KEY UPDATE等语句。但这种方法可能会增加数据库的负担,影响数据库性能。 2. **基于缓存实现**:利用缓存系统(如Redis)的原子操作来创建分布式锁。例如,可以使用SETNX命令设置键值,配合过期时间...
MySQL 批量更新的高效方法 MySQL 批量更新是指在 MySQL 数据库中批量更新多... On Duplicate Key Update 语句可以大大提高更新效率,而使用临时表的方法也可以提高效率,但是需要用户有 temporary 表的 create 权限。