MySQL INSERT ... SELECT ... ON DUPLICATE KEY UPDATE Инкремент - PullRequest
3 голосов
/ 20 апреля 2011

У меня возникли проблемы с запросом INSERT SELECT ON DUPLICATE KEY UPDATE. Я хочу выполнить такие действия, как увеличение поля в таблице, в которую вставляется каждая строка, возвращаемая оператором select, некоторые из которых должны будут обновить одну и ту же строку.

Настройка:

Таблица источника

    CREATE TABLE `source` (
  `key` int(11) NOT NULL AUTO_INCREMENT,
  `data` int(11) DEFAULT NULL,
  `state` int(11) DEFAULT NULL,
  `group` int(11) DEFAULT NULL,
  PRIMARY KEY (`key`)
);

Таблица dest

    CREATE TABLE `dest` (
      `dkey` int(11) NOT NULL,
      `ddata` int(11) DEFAULT NULL,
      `dstate` int(11) NOT NULL,
      PRIMARY KEY (`dkey`,`dstate`)
    ) ;

Исходные тестовые значения

INSERT INTO `source` (`key`,`data`,`state`,`group`) VALUES (1,1,1,1);  
INSERT INTO `source` (`key`,`data`,`state`,`group`) VALUES (2,2,2,1);   
INSERT INTO `source` (`key`,`data`,`state`,`group`) VALUES (8,4,2,1);

Запрос:

INSERT INTO `test`.`dest` (`dkey`,`ddata`,`dstate`)   
    SELECT `group`,`data`,`state` FROM `test`.`source`   
    WHERE `group` = 1  
    ON DUPLICATE KEY UPDATE  
     `ddata`= `ddata`+VALUES(`ddata`);

Что мне нужно сделать, это когда строка еще не существует в dest, чтобы создать новую строку с данными = 1. Когда строка уже существует, мне нужно, чтобы она увеличивала данные.

После выполнения вышеуказанного запроса получаются следующие результаты:

dkey ddata dstate  
1 1 1  
1 4 2   

Где я хочу, чтобы они были

1 1 1  
1 6 2   

Вместо добавления к предыдущему значению оно заменяет его.

Есть предложения?

1 Ответ

1 голос
/ 20 апреля 2011

При воспроизведении получаю следующие результаты:

1, 1, 1
1, 6, 2

, что кажется правильным, поскольку у вас есть data = 1 для state = 1 и data = 2, 4 для state = 2 в ваших исходных данных.

Почему вы ожидаете 2 в первой записи?

...