MySQL:插入....重复键更新:受影响的行== 3?

标签 mysql insert-update connector-j

MySQL 文档指出,当使用 INSERT ... ON DUPLICATE KEY UPDATE 时,插入记录时受影响的行值将为 1,如果更新现有记录则为 2。

当更新记录时,我们得到的受影响行值为 3,尽管我仅在使用 Java 中的 Connector-J 通过 MySQL 调用执行更新时才看到这一点;当我从 MySQL Workbench 调用存储过程时,我得到了更新 2 行的预期结果。

有人知道这意味着什么吗?这可能是 Connector-J 异常吗?我倾向于直接使用它,但如果没有合理的解释,我就会担心数据完整性(毕竟,这是检查受影响行值的原因之一)。

MySQL服务器版本:5.1.57;连接器-J版本:5.1.7(Java 1.6)

其他详细信息: 这是正在修改的表:

CREATE TABLE `UserContactProperty` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `UserContactId` int(11) NOT NULL,
  `Property` varchar(45) NOT NULL,
  `Value` tinytext,
  `Date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `Contact-Property` (`UserContactId`,`Property`),
  KEY `FK_UserContact` (`UserContactId`),
  CONSTRAINT `FK_UserContact` FOREIGN KEY (`UserContactId`) REFERENCES `UserContact` (`id`) ON   DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=28685 DEFAULT CHARSET=latin1

执行插入/更新的存储过程如下:

CREATE PROCEDURE `setUserContactProperty`(
    UID VARCHAR(50),
    CID INT,
    Prop VARCHAR(45),
    Val TINYTEXT
)
BEGIN
    INSERT INTO UserContactProperty ( UserContactId, Property, Value )
        VALUES ( CID, Prop, Val )
        ON DUPLICATE KEY UPDATE Value = Val, Date = CURRENT_TIMESTAMP;
END

最佳答案

这似乎是一个错误。请检查以下链接:

http://bugs.mysql.com/bug.php?id=46675

据报道,该错误与另一个错误有关,其中生成的 key 列表是错误的,并且计数也是错误的。 (第二个bug源自这里http://slava-technical.blogspot.co.il/2011/05/mysql-on-duplicate-key-update-breaks.html)

我认为您需要找到解决方法。可能是通过在插入之前查询数据库来查看具有此键的行是否存在。或者插入并捕获重复的键异常,然后在这种情况下进行更新。

关于MySQL:插入....重复键更新:受影响的行== 3?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11572180/

相关文章:

php - 无法通过插入查询来使用 php 插入 id

mysql - MySQL 的 Connector/J 可以与 MariaDB 一起使用吗?

mysql - mysql 8.0.15 的用户的 JDBC 连接器

java - 从服务器上的小程序连接sql数据库,使用localhost还是实际ip

php - MySQL:子查询是正确的做法吗?

php - 如何显示来自 mysql PHP 的图像

php - CodeIgniter 3 中的命名查询绑定(bind)?

mysql - 需要查询来检索与另一表连接的一个表中的所有行

php - 如果mysql表中user_id不存在,如何插入新数据

python - MariaDB 在 Debian Stretch 中对重复键执行许多操作