MySQL文档说明当使用INSERT ... ON DUPLICATE KEY UPDATE时,插入记录时受影响的行值为1,如果更新现有记录则为2。
当更新记录时,我们得到的受影响的行值为3,尽管我只是在使用来自Java的Connector-J通过MySQL调用执行更新时才看到这一点;当我从MySQL Workbench调用存储过程时,我得到了2行更新的预期结果。
有谁知道这可能意味着什么?这可能是一个连接器-J异常吗?我倾向于使用它,但是如果没有合理的解释,我就会担心我的数据完整性(毕竟,这是检查受影响的行值的原因之一)。
MySQL服务器版本:5.1.57; Connector-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
答案 0 :(得分:2)
这似乎是一个错误。请查看以下链接:
http://bugs.mysql.com/bug.php?id=46675
正如在那里报告的那样,该错误与另一个错误有关,其中生成的密钥列表错误并且计数也是错误的。 (第二个错误源自此处http://slava-technical.blogspot.co.il/2011/05/mysql-on-duplicate-key-update-breaks.html)
我认为您需要找到一种解决方法。可能是在插入之前查询数据库以查看具有此键的行是否存在。或插入并捕获重复键异常,然后在这种情况下进行更新。