Откат таблицы SQLite

в Android SQLite у меня была одна таблица MyTable. По ошибке я уронил его после обновления БД.

Как я могу откатить эту таблицу, если это возможно.

любой ответ будет принят.

спасибо.

3 ответов


удаление таблиц составляет не восстанавливаемое действие, если не выполняется как часть транзакции, которая откатывается (которая кажется не сценарий для вашего конкретного случая).

С документация 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;

что показывает, что таблица все еще существует после отката. Если вы совершаете, а не откатываете (или если вы вообще уберете транзакционный контроль), стол умер, истек, ушел на встречу со своим создателем, стасовал эту смертную катушку, .

Итак, раз ты не сделайте это как часть откатной транзакции (о чем свидетельствует тот факт, что таблица и фактически ушел), вам нужно будет воссоздать его с нуля (или из резервных копий, если это возможно).


пояснение:

хотя вы можете фиксировать или откатывать операторы DML, такие как" insert "или" delete "(при условии, что вы делаете это в транзакции), в целом вы не можете откатить оператор DDL, такой как" alter table "или"drop table".

Это верно для большинства баз данных в большинстве случаев: Oracle, MSSQL, mySQL и т. д.

есть исключение для sqlite: если вы drop table в транзакции, то rollback будет восстановить эта таблица.

в противном случае (согласно руководству sqlite):

оператор DROP TABLE удаляет таблицу, добавленную с помощью CREATE TABLE заявление. Указанное имя является именем таблицы. Упал стол полностью удалена из схемы базы данных и дискового файла. Этот таблица не может быть восстановлена. Все индексы и триггеры, связанные с таблица также удаленный.

PS:

эта ссылка обсуждает "DDL", " DML " и связанные с ними аббревиатуры, если вам интересно:


Я думаю, что есть две разные интерпретации этого вопроса, и я хочу убедиться, что оба ответа и убедительно продемонстрированы, так как это все еще лучший результат поиска для SQLite в таблицу падения откат (и ссылки на документацию SQLite также вводят в заблуждение).

на первый вопрос, вы can откат действие DDL таблицы перетаскивания, которое происходит в области транзакции, т. е.

// with connection created
var transaction = connection.BeginTransaction();
try {
    // create a table
    // drop a different table
    transaction.Commit(); // go ahead and commit if everything is successfully
}
catch
{
    transaction.Rollback(); // rollback in case of error
}

и подтвердить это то же самое поведение в языковом агностическом стиле, вот то же самое поведение с помощью командной строки SQ Lite:

sqlite3 demo
// outside transaction scope
create table tbl1( col varchar(10));
// list the current tables
.tables
// start a transaction that wraps both your DDL commands 
begin transaction;
enter code here
create table tbl2 (col varchar(10));
drop table tbl1;
rollback;
.tables

ожидается, что окончательное list tables команда, все равно должна вернуться tbl1 так как create table и drop table команды были отменены. Другой способ сказать, что SQLite не связан тем же различием DML/DDL для того, какие операции могут быть откатаны, которые присутствуют в Oracle.

для второго толкования вопрос, т. е. могу ли я восстановить таблицу, удаленную за пределы области транзакции (что также повлечет за собой опыт" Oh S#%T", который вы, возможно, имели в качестве разработчика, а также аварийное восстановление), ссылки на документацию SQ Lite уместны:

упавшая таблица полностью удаляется из схемы базы данных и файла диска. Таблица не может быть восстановлена. Все индексы и триггеры, связанные с таблицей, также удаляются.