MySQL のドキュメントには、INSERT ... ON DUPLICATE KEY UPDATE を使用する場合、影響を受ける行の値は、レコードが挿入された場合は 1、既存のレコードが更新された場合は 2 になると記載されています。
Java から Connector-J を使用して MySQL 呼び出しを介して更新が実行された場合にのみこれが表示されますが、レコードが更新されると、影響を受ける行の値が 3 になります。MySQL Workbench からストアド プロシージャを呼び出すと、期待される結果として 2 行が更新されます。
これが何を意味するのか誰にも分かりませんか?これはおそらく Connector-J の異常でしょうか? 私はただそれを実行する傾向がありますが、合理的な説明がなければ、データの整合性に関する懸念が残ります (これは、影響を受ける行の値をチェックする理由の 1 つです)。
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