web-dev-qa-db-ja.com

実行したばかりのmysqlステートメントを元に戻すにはどうすればよいですか?

最後に実行したmysqlクエリを元に戻すにはどうすればよいですか?

47
Hari kanna

テーブルタイプをInnoDBとして定義すると、トランザクションを使用できます。 AUTOCOMMIT=0を設定し、クエリまたはセッションの最後にCOMMITまたはROLLBACKを発行してトランザクションを送信またはキャンセルする必要があります。

ROLLBACK -- will undo the changes that you have made
33
Vimard

これはトランザクション中にのみ可能です。

BEGIN;
INSERT INTO xxx ...;
DELETE FROM ...;

その後、次のいずれかを実行できます。

COMMIT; -- will confirm your changes

または

ROLLBACK -- will undo your previous changes
30
Palantir

基本的に、トランザクションを実行している場合は、単にロールバックを実行します。そうしないと、MySQLクエリを「元に戻す」ことができません。

20
halfdan

ALTER TABLEのような一部の命令では、これはMySQL(トランザクション( 1 および 2 )でも)では不可能です。

5
adelarsq

これによって処理されているクエリを停止できます

=> show processlist;でクエリプロセスのIDを見つけます。

次に=> kill id;

4
RINSON KE

最後のクエリを元に戻す必要があるだけではない場合(実際にはあなたの質問は実際にそれを指しているだけです)

クエリをコミットする前に元のデータをコピーし、両方のテーブルで同じでなければならない一意のIDに基づいてオンデマンドで書き戻します。ロールバックテーブル(変更されていないデータのコピーを含む)と実際のテーブル(「元に戻す」必要があるデータを含む)。多くのテーブルを持つデータベースの場合、元のデータの構造化されたダンプ/コピーを含む1つの「ロールバックテーブル」は、実際のテーブルごとに1つ使用する方が適切です。実際のテーブルの名前、行の一意のID、および3番目のフィールドに、データ構造と値を明確に表す任意の形式(XMLなど)のコンテンツが含まれます。最初の2つのフィールドに基づいて、この3番目のフィールドが解析され、実際のテーブルに書き戻されます。タイムスタンプを持つ4番目のフィールドは、このロールバックテーブルのクリーンアップに役立ちます。

トランザクションの「ロールバック」にもかかわらず、SQLの方言に本当の取り消しはないため(間違っている場合は修正してください-現在1つあります)、これが唯一の方法であり、コードを記述する必要がありますあなた自身でそれのために。

1
meistermuh