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”插入新记录时将旧值增加新值的主要内容,如果未能解决你的问题,请参考以下文章