5.1、ON DUPLICATE KEY UPDATE每次更新导致id不连续 5.2、death lock死锁 有时候由于业务需求,可能需要先去根据某一字段值查询数据库中是否有记录,有则更新,没有则插入。这个时候就可以用到ON DUPLICATE KEY UPDATE这个sql语句了。 以下内容基于本地windows环境mysql:8.0.34进行讲解。 一、ON DUPLICATE KEY UPD...
1、先SELECT一下,再决定INSERT还是UPDATE; 2、直接UPDATE,如果受影响行数是0,再INSERT; 3、直接INSERT,如果发生主键冲突,再UPDATE; 这几种方法都有缺陷,对MySQL来说其实最好的是直接利用INSERT...ON DUPLICATE KEY UPDATE...语句,具体到上面的test表,执行语句如下 : 1 INSERTINTOtestVALUES(1,'2016-1-1', ...
对于”INSERT INTO t (c1,c2) VALUES(x,y) ON DUPLICATE KEY UPDATE”语句,无论唯一索引列所指向的行是否存在,都需要推进auto increment的值。相关代码如下: if (error == DB_SUCCESS && table->next_number_field && new_row == table->record[0] && thd_sql_command(m_user_thd) == SQLCOM_INSERT...
ON DUPLICATE KEY UPDATE写起来虽然方便,但是这个受影响行数是不可用于业务判断的,如批量插入判断插入行数。并且也有一定的性能影响,比单独的更新语句更耗时,建议少用。
新值大于旧值更新 INSERT IGNORE INTO `tableName`(`id`,`field_1`) VALUES('1','100'),('2','200') ON DUPLICATE KEY UPDATE field_1 = IF(VALUES(field) > tableName.field_1, tableName.field_1, VALUES(field_1))
ON DUPLICATE KEY UPDATE uid=`uid`,kNum=kNum+`kNum`,mNum=mNum+`mNum`; END 输入参数为 IN `uid` varchar(10),IN `kNum` int,IN `mNum` int b、构建表: DROP TABLE IF EXISTS `test`; CREATE TABLE `test` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, ...
正确的sql是: INSERT INTO test (uid,kNum,mNum) VALUES ('2012', 0, 1) ON DUPLICATE KEY UPDATE uid=uid,kNum=VALUES(kNum)+kNum,mNum=VALUES(mNum)+mNum; 即:kNum=VALUES(kNum)+kNum
如果插入的记录存在主键或唯一索引(例如:上例中name便是唯一索引),且表中存在该记录,那么就会认为该条记录存在,则便是更新语句。 2. ON DUPLICATE KEY UPDATE语法的坑 2.1 导致主键不连续自增 ON DUPLICATE KEY UPDATE可能会导致主键不连续自增。 MySQL性能(4)—AUTO_INCRMENT锁机制(innodb_autoinc_lock_mode参数...
此时就要执行更新语句。 当然满足一部分唯一索引是不会触发更新操作的, 此时会执行插入操作。 而至于要更新哪些字段,要看我们自己的需求了。 先声明一点:ON DUPLICATE KEY UPDATE 这个子句是MySQL特有的,语句的作用是,当insert已经存在的记录时,就执行update。