Android SQLite では、1 つの table がありMyTable
ました。DBのアップグレード後に誤って落としてしまいました。
可能であれば、ドロップしたテーブルをロールバックするにはどうすればよいですか。
どんな良い答えでも受け入れられます。
ありがとう。
テーブルの削除は、ロールバックされるトランザクションの一部として実行されない限り、回復可能なアクションではありません (これは、特定のケースのシナリオではないようです)。
SQLiteのドキュメントから:
DROP TABLE ステートメントは、CREATE TABLE ステートメントで追加されたテーブルを削除します。指定された名前はテーブル名です。
削除されたテーブルは、データベース スキーマとディスク ファイルから完全に削除されます。テーブルを回復できません。テーブルに関連付けられているすべてのインデックスとトリガーも削除されます。
ロールバックされたトランザクションでの動作は ( https://sqliteonline.com/でテスト済み)で確認できるため、完全な画像ではありません。
drop table if exists paxtable;
create table paxtable (paxcolumn integer);
insert into paxtable values (42);
begin transaction;
drop table paxtable;
rollback;
select paxcolumn from paxtable;
これは、ロールバック後もテーブルがまだ存在していることを示しています。ロールバックせずにコミットした場合 (またはトランザクション制御を完全に削除した場合)、テーブルは停止し、期限切れになり、作成者に会いに行き、この致命的なコイルからシャッフルされます。<ここにお気に入りの比喩を挿入>.
したがって、ロールバックされたトランザクションの一部としてそれを実行しなかったため(テーブルが実際になくなったことからも明らかなように)、最初から (または可能であればバックアップから) 再作成する必要があります。
説明:
「insert」や「delete」などの DML ステートメントをコミットまたはロールバックできますが (トランザクション内で実行する場合)、通常、「alter table」や「drop table」などの DDL ステートメントをロールバックすることはできません。
これは、Oracle、MSSQL、mySQL など、ほとんどの状況下のほとんどのデータベースに当てはまります。
sqlite には例外drop table
があります。トランザクション中の場合、aはそのテーブルrollback
を復元します。
それ以外の場合 (sqlite マニュアルに従って):
DROP TABLE ステートメントは、CREATE TABLE ステートメントで追加されたテーブルを削除します。指定された名前はテーブル名です。削除されたテーブルは、データベース スキーマとディスク ファイルから完全に削除されます。テーブルを回復できません。テーブルに関連付けられているすべてのインデックスとトリガーも削除されます。
PS:
興味がある場合は、このリンクで「DDL」、「DML」、および関連する頭字語について説明しています。