Откат таблицы SQLite
в Android SQLite у меня была одна таблица MyTable
. По ошибке я уронил его после обновления БД.
Как я могу откатить эту таблицу, если это возможно.
любой ответ будет принят.
спасибо.
3 ответов
удаление таблиц составляет не восстанавливаемое действие, если не выполняется как часть транзакции, которая откатывается (которая кажется не сценарий для вашего конкретного случая).
инструкция 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 уместны:
упавшая таблица полностью удаляется из схемы базы данных и файла диска. Таблица не может быть восстановлена. Все индексы и триггеры, связанные с таблицей, также удаляются.