获取ON DUPLICATE KEY UPDATE多次插入时插入的行数?

时间:2012-06-07 04:22:57

标签: mysql

我有一个非常大的表,主键为BINARY(20)

该表有大约1700万行。 cron作业每隔一小时尝试使用ON_DUPLICATE_KEY_UPDATE语法在此表中插入多达50,000个新条目。

cronjob中的每个插入都有1,000个值(多次插入)。如何从此查询中获取插入表中的行数?我之前和之后都不能进行行计数,因为有大约1700万行并且查询太贵了。

在手册mysql中说,对于插入的行,受影响的行数为1,对于更新的字段,它为2,这意味着在我的1000 INSERT ON DUPLICATE KEY UPDATE查询中我可能已经受到影响行数从1000到2000,但我无法知道从这个数字中插入了多少条记录?

我怎样才能克服这个?

由于

2 个答案:

答案 0 :(得分:11)

插入数量为2000减去受影响的行数。更一般地说:

(numberOfValuesInInsert * 2) - mysql_affected_rows()

修改

作为tomas points outMySQL docs实际上说:

  

使用ON DUPLICATE KEY UPDATE,如果将行作为新行插入,则每行的受影响行值为1;如果现有行更新,则为每行,如果现有行设置为当前行,则为0值

[强调我的]

因此,如果将现有行设置为相同的值是可能的,则无法确定更新与插入的行数,因为两个插入与一个具有不同值的更新无法区分+一个具有相同值的更新

答案 1 :(得分:7)

当你的作业是插入1000时,有些是纯插入,有些是更新,因为你有ON_DUPLICATE_KEY_UPDATE。 这样就得到了第一个等式

(1)插入+更新=插入的行数(在本例中为1000)

我举一个简单的例子,你为my_sql_affected_rows获得了1350的值。 因为对于Insert值为1并且为了更新值2为聚合到my_sql_affected_rows。我得到以下等式。

(2)插入+ 2 *更新= my_sql_affected_rows(在本例中为1350)。

减去(2) - (1)。你得到了

(3)Updates = my_sql_affected_rows - 没有插入行

更新= 1350 - 1000(在本例中)。

更新= 350。

等式(1)中的更新的替代值,你得到

插入= 650

因此,要获得更新的数量,您只需要直接使用等式(3)。