2

以下のようなクエリがあり、単一の更新クエリにする必要があります。私は初心者なので、結合を使用して単一行のクエリを書きましたが、次のようなエラーが発生します

ロック待機タイムアウトを超えました。トランザクションを再開してみてください

以下は、個々の更新クエリです...

update a set id=id-1 where id>'3' and reg='34554';
update b set id=id-1 where id>'3' and reg='34554';
update c set id=id-1 where id>'3' and reg='34554';
update d set id=id-1 where id>'3' and reg='34554';
update e set id=id-1 where id>'3' and reg='34554';

以下は、私が試したもので、上記のようにエラーが発生しました...

update a
LEFT JOIN b ON b.id=a.id and b.tan=a.tan
LEFT JOIN c ON c.id=b.id and c.tan=b.tan
LEFT JOIN d ON d.id=c.id and d.tan=c.tan
LEFT JOIN e ON e.id=d.id and e.tan=d.tan
SET a.id=b.id=c.id=d.id=e.id=a.id-1
where a.id>'3' and a.tan='34554';
4

2 に答える 2

1

ストアドプロシージャに複数のSQLを格納してから、Javaからプロシージャを呼び出すことができます。Idとregにはパラメータを渡すことができます。

ストアドプロシージャに関する情報http://dev.mysql.com/doc/refman/5.0/en/create-procedure.html

これはMysqlコマンドラインで行う必要があります...

Delimiter |

Create procedure (in id_val int, in reg_val int)

Begin

update a set id=id-1 where id>id_val and reg=reg_val;

update b set id=id-1 where id>id_val and reg=reg_val;

update c set id=id-1 where id>id_val and reg=reg_val;

update d set id=id-1 where id>id_val and reg=reg_val;

update e set id=id-1 where id>id_val and reg=reg_val;

End |

delimiter ;

私はPHPを使用しています...次のリンクの情報 http://php.net/manual/en/pdo.prepared-statements.php

Javaの希望...このリンクは役立つかもしれません http://www.easywayserver.com/jdbc/JDBC-prepared-statement.htm

于 2012-04-05T11:42:19.950 に答える
0

トランザクションを使用する必要があります

SET autocommit=0;
LOCK TABLES a WRITE, b WRITE, c WRITE, d WRITE, e WRITE

update a set id=id-1 where id>'3' and reg='34554';
update b set id=id-1 where id>'3' and reg='34554';
update c set id=id-1 where id>'3' and reg='34554';
update d set id=id-1 where id>'3' and reg='34554';
update e set id=id-1 where id>'3' and reg='34554';

COMMIT;
UNLOCK TABLES;

ロック テーブルとトランザクションの組み合わせについては、こちらを参照してください。

結合を使用してそのようなクエリを作成する方法がわかりません。

于 2012-04-05T10:45:31.110 に答える