3

INSERT SELECT ON DUPLICATEKEYUPDATEクエリで問題が発生しています。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`)
);

テーブル宛先

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

私がする必要があるのは、データ= 1の新しい行を作成するために、行がdestにまだ存在していない場合です。行がすでに存在する場合は、データをインクリメントする必要があります。

上記のクエリを実行した後の結果は次のとおりです。

dkey ddata dstate  
1 1 1  
1 4 2   

私が彼らになりたいのは

1 1 1  
1 6 2   

以前の値に追加する代わりに、それを置き換えています。

助言がありますか?

4

1 に答える 1

1

複製すると、次の結果が得られます。

1, 1, 1
1, 6, 2

ソースデータにdata = 1forstate = 1data = 2, 4forがあるので、これは正しいようです。state = 2

なぜ2最初のレコードに期待しているのですか?

于 2011-04-20T10:22:19.140 に答える