MySQL documentation声明:
如果ON DUPLICATE KEY UPDATE,则每行的受影响行值为1 该行将作为新行插入,如果现有行已更新,则为2。
然而,在使用它时,我得到了不同的结果。对于相同的多个主要唯一密钥,在考虑更新而不是新插入之前需要5或6个更新。 我首先想到它可能是mysql包中的nodejs会被窃听?
然而,我注意到通过mysql shell,我得到了相同类型的错误:
INSERT INTO table SET `master_id` = 119, `slave_id` = 1221829,
`date` = '2014-09-18', `type` = '42', `threshold` = '18',
`value` = 18.3536, `ratio` = '1.96'
ON DUPLICATE KEY UPDATE value = (value + VALUES(value)) / 2,
ratio = (ratio + VALUES(ratio)) / 2;
Query OK, 1 row affected (0.00 sec)
INSERT INTO alerts SET `master_id` = 119, `slave_id` = 1221829,
`date` = '2014-09-18', `type` = '42', `threshold` = '18',
`value` = 18.3536, `ratio` = '1.96'
ON DUPLICATE KEY UPDATE value = (value + VALUES(value)) / 2,
ratio = (ratio + VALUES(ratio)) / 2;
Query OK, 0 rows affected (0.00 sec)
INSERT INTO alerts SET `master_id` = 119, `slave_id` = 1221829,
`date` = '2014-09-18', `type` = '42', `threshold` = '18',
`value` = 18.3536, `ratio` = '1.96'
ON DUPLICATE KEY UPDATE value = (value + VALUES(value)) / 2,
ratio = (ratio + VALUES(ratio)) / 2;
Query OK, 2 rows affected (0.00 sec)
是否因为不建议使用ON DUPLICATE KEY作为多个主键,如下所述?
通常,您应该尽量避免使用ON DUPLICATE KEY UPDATE 具有多个唯一索引的表的子句。
或者是因为它是相同的值?或者因为两次插入之间的间隔太短(约10秒)?
我的表有以下主键:{master_id,slave_id,date,type}
我真的不明白......
答案 0 :(得分:0)
您获得0个受影响的行,因为UPDATE语句不会更改值。
对于UPDATE语句,默认情况下受影响的行值为 实际更改的行数。如果指定CLIENT_FOUND_ROWS 当连接到mysqld时,标记为mysql_real_connect() affected-rows value是“找到”的行数;也就是说,匹配 WHERE子句。