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);
注意:first
、last
和 source
是 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
sql UPDATE ON DUPLICATE KEY造成MYSQL死锁现场