【问题标题】:MySQL INSERT ... SELECT... ON DUPLICATE KEY UPDATE incrementMySQL INSERT ... SELECT ... ON DUPLICATE KEY UPDATE 增量
【发布时间】:2011-08-09 09:09:01
【问题描述】:

我在使用 INSERT SELECT ON DUPLICATE KEY UPDATE 查询时遇到了一些问题。我想为选择返回的每一行执行一些操作,例如在插入的表中增加一个字段,其中一些需要更新同一行。

设置:

表格来源

    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`)
);

表格目的地

    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 用于发布脚本。都像@Link 那样做!

标签: mysql sql insert-update


【解决方案1】:

复制时,我得到以下结果:

1, 1, 1
1, 6, 2

这似乎是正确的,因为您的源数据中有data = 1 对应state = 1data = 2, 4 对应state = 2

你为什么在第一条记录中期待2

【讨论】:

  • 我不是。我从我创建的测试数据库中复制它时犯了一个错误。谢谢你指出来。然而,我遇到的问题是第二行。谢谢@Quassnoi
  • @Link:我无法重现该问题。你确定它也不是来自测试数据库吗?
  • 仍然不确定是什么问题,但我似乎已经解决了。实际上,问题似乎与 INSERT SELECT UPDATE 代码无关,但我认为这更像是我的列引用的问题。始终使用完全限定的列名。 >>
猜你喜欢
  • 2011-01-29
  • 2015-05-16
  • 1970-01-01
  • 2023-02-06
  • 2010-10-07
  • 1970-01-01
  • 2017-04-14
  • 1970-01-01
  • 2013-10-03
相关资源
最近更新 更多