0

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

+------------+--------------+------+-----+---------+-------+
| 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 中使用“重复密钥更新”来实现这一点?或者有没有其他有效的方法来实现这一目标?该表将非常大(有数百万行)。

4

2 回答 2

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);

注意:firstlastsourceMySQL关键字。我不建议将它们用作列名。

于 2020-10-31T00:35:14.243 回答
1

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

于 2020-10-31T00:49:16.503 回答