MySQL 通过“on duplicate key update”插入新记录时将旧值增加新值

Posted

技术标签:

【中文标题】MySQL 通过“on duplicate key update”插入新记录时将旧值增加新值【英文标题】:MySQL increase the old value by the new value when inserting new records by "on duplicate key update" 【发布时间】:2020-10-31 00:33:56 【问题描述】:

我创建了一个这样的新表:

+------------+--------------+------+-----+---------+-------+
| Field      | Type         | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+-------+
| first      | varchar(100) | NO   | PRI | NULL    |       |
| last       | varchar(400) | NO   | PRI | NULL    |       |
| source     | varchar(100) | NO   |     | NULL    |       |
| count      | int          | YES  |     | 1       |       |
+------------+--------------+------+-----+---------+-------+

我尝试使用以下方法向该表中插入多条记录:

insert into my_table(first,last,source,count) values ('a','b','c',50),('a','b','c',20),('d','e','f',30) on duplicate key update count = count + 1;

插入后,这是表格的内容:

+------------+-----------+--------+-------+
| first      | last      | source | count |
+------------+-----------+--------+-------+
| a          | b         | c      |     2 |
| d          | e         | f      |     1 |
+------------+-----------+--------+-------+

但是,我希望通过新记录值中提供的数字(即提供的示例中的 50、20 和 30)来更新计数。所以,表格应该是这样的:

+------------+-----------+--------+-------+
| first      | last      | source | count |
+------------+-----------+--------+-------+
| a          | b         | c      |    70 |
| d          | e         | f      |    30 |
+------------+-----------+--------+-------+

是否可以在 mysql 中使用“重复键更新”来实现这一点?或者有没有其他有效的方法来实现这一目标?该表将非常大(有数百万行)。

【问题讨论】:

我不知道你在用这个做什么,但对我来说,这会引起一些警告。您最好删除唯一索引,而只需运行查询 sum() 计数列并将其按唯一索引中的列分组。以您现在的方式,可能会添加两次,除非您在其他地方有记录,否则很难识别和修复。 【参考方案1】:

考虑VALUES() 语法,您可以在on duplicate key 子句中使用它来引用本来会被插入的列值:

insert into my_table(first, last, source, count) 
values ('a','b','c',50), ('a','b','c',20), ('d','e','f',30) 
on duplicate key update count = count + VALUES(count);

注意:firstlastsource 是 MySQL keywords。我不建议将它们用作列名。

【讨论】:

【参考方案2】:

VALUES() 是使用的方法,如 GMB 所述,如果您使用的 mysql 版本早于 8.0.19。但是,从 8.0.20 开始,它已被弃用,如果您使用的是 mysql 8.0.19 或更高版本,建议为正在插入的行提供别名,然后通过别名引用插入的值,如下所示:

insert into my_table (first, last, source, count) 
values ('a','b','c',50), ('a','b','c',20), ('d','e','f',30) as newRow
on duplicate key update count = count + newRow.count;

更多信息可以在这里找到:https://dev.mysql.com/doc/refman/8.0/en/insert-on-duplicate.html

【讨论】:

以上是关于MySQL 通过“on duplicate key update”插入新记录时将旧值增加新值的主要内容,如果未能解决你的问题,请参考以下文章

MySQL INSERT ON DUPLICATE KEY UPDATE

mysql ON DUPLICATE KEY UPDATE

sql UPDATE ON DUPLICATE KEY造成MYSQL死锁现场

mysql insert on duplicate key

mysql ON DUPLICATE KEY UPDATE ;

on duplicate key mysql插入更新