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 はありません。他に何ができますか?