3

1 つのトランザクション内で 2 つのテーブルを更新する必要があります。個々のクエリは次のようになります。

1. INSERT INTO t1 (col1, col2) 
   VALUES (val1, val2) 
   ON DUPLICATE KEY 
      UPDATE col2 = val2;

上記のクエリで挿入が発生した場合は、2 番目のテーブルで次のステートメントを実行する必要があります。

2. INSERT INTO t2 (col1, col2) 
   VALUES (val1, val2) 
   ON DUPLICATE KEY  
      UPDATE col2 = col2 + val2;

それ以外は、

3. UPDATE t2 
       SET col2 = col2 - old_val2 + val2 
     WHERE col1 = val1; 
   -- old_val2 is the value of 
      t1.col2 before it was updated

今、最初に t1 で SELECT を実行して、ステートメント 1 が t1 で挿入または更新を引き起こすかどうかを判断します。次に、ステートメント 1 と、トランザクション内でステートメント 2 と 3 のいずれかを実行します。これらすべてを 1 つのトランザクション内で行うにはどうすればよいですか?

私が考えていたアプローチは次のとおりです。

UPDATE t2, t1 
   set t2.col2 = t2.col2 - t1.col2 
 WHERE t1.col1 = t2.col2 
   and t1.col1 = val1;

INSERT INTO t1 (col1, col2) 
VALUES (val1, val2) 
ON DUPLICATE KEY 
   UPDATE col2 = val2;

INSERT INTO t2, t1 (t2.col1, t2.col2) 
VALUES (t1.col1, t1.col2) 
ON DUPLICATE KEY 
   UPDATE t2.col2 = t2.col2 + t1.col2 
WHERE t1.col1 = t2.col2 
  and t1.col1 = val1;

残念ながら、MySQL 5.0 にはマルチテーブル INSERT... ON DUPLICATE KEY UPDATE はありません。他に何ができますか?

4

2 に答える 2

1

INSERTまたはを実行するUPDATEと、クライアントは変更された行数を取得できます。INSERTこれを行う方法はクライアントによって異なりますが、いくつかのプログラミング言語では、成功した場合にこの番号が返されます。

を実行するINSERT...ON DUPLICATE KEY UPDATEと、この数値を取得することもできますが、期待どおりの数値ではありません。単一の行を挿入/更新すると、変更された行が 1 つしかない場合でも、の場合は変更された行数として 1 を受け取り、 の場合はINSERT2を受け取ります。UPDATEこの数を使用して、次に実行するクエリをクライアント側で決定できます。

単一のトランザクションほど良くはありませんが、少なくとも 1 つのトランザクションを取り除くことができますSELECT

于 2010-03-22T14:41:25.740 に答える
0

さて、私はこれを理解して、私が好きなようにしました:

 UPDATE t2, t1 
   SET t2.col2 = t2.col2 - t1.col2 
 WHERE t1.col1 = t2.col2 
   AND t1.col1 = val1;

INSERT INTO t1 (col1, col2) VALUES (val1, val2) 
ON DUPLICATE KEY UPDATE
   col2 = val2;

INSERT INTO t2 (col1, col2) VALUES (val1, val2) 
ON DUPLICATE KEY UPDATE
   col2 = col2 + VALUES(col2);

3 番目のクエリは、次のように t1 からの値を参照するように書き直すことができます。

INSERT INTO t2 (col1, col2)
   SELECT col1, col2 FROM t1 WHERE col1 = val1
ON DUPLICATE KEY UPDATE
   t2.col2 = t2.col2 + VALUES(col2);
于 2010-03-25T08:44:53.497 に答える