2

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
4

1 に答える 1

2

バグのようです。次のリンクを確認してください。

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

そこで報告されているように、このバグは、生成されたキーリストが間違っており、カウントも間違っている別のバグに関連しています。(2番目のバグはここhttp://slava-technical.blogspot.co.il/2011/05/mysql-on-duplicate-key-update-breaks.htmlから発生しました)

回避策を見つける必要があると思います。おそらく、挿入する前にデータベースにクエリを実行して、このキーを持つ行が存在するかどうかを確認します。または、重複キーの例外を挿入してキャッチし、その場合は更新を行います。

于 2012-07-20T04:01:48.740 に答える