В документации MySQL указано, что при использовании INSERT ... ON DUPLICATE KEY UPDATE значение затронутых строк будет равно 1 при вставке записи и 2 при обновлении существующей записи.
Мы получаем значение затронутых строк, равное 3, когда запись обновляется, хотя я вижу это только тогда, когда обновления выполняются через вызовы MySQL с использованием Connector-J из Java; когда я вызываю хранимую процедуру из MySQL Workbench, я получаю ожидаемый результат обновления 2 строк.
Кто-нибудь знает, что это может означать? Возможно, это аномалия Connector-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