6

在 Android SQLite 中,我有一张桌子MyTable。错误地我在升级数据库后放弃了它。

如果可能的话,我怎样才能回滚那个丢弃的表。

任何好的答案都会被接受。

谢谢。

4

3 回答 3

5

删除表不是可恢复的操作,除非作为回滚事务的一部分执行(这似乎不是您的特定情况的场景)。

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;

这表明该表在回滚后仍然存在。如果您提交而不是回滚(或者如果您完全删除事务控制),则表已经死亡,过期,去见它的制造者,洗牌了这个致命的线圈,<在此处插入您最喜欢的隐喻>。

因此,由于您没有将其作为回滚事务的一部分进行(正如表实际上已经消失的事实所证明的那样,您需要从头开始重新创建它(或者如果可能的话从备份中重新创建它)。

于 2013-02-05T06:20:43.720 回答
5

澄清:

尽管您可以提交或回滚诸如“插入”或“删除”之类的 DML 语句(前提是您在事务中执行此操作),但通常您不能回滚诸如“更改表”或“删除表”之类的 DDL 语句。

在大多数情况下,大多数数据库都是如此:Oracle、MSSQL、mySQL 等。

sqlite有一个例外:如果您drop table在事务中,那么 arollback恢复该表。

否则(根据 sqlite 手册):

DROP TABLE 语句删除使用 CREATE TABLE 语句添加的表。指定的名称是表名。删除的表从数据库模式和磁盘文件中完全删除。该表无法恢复。与表关联的所有索引和触发器也将被删除。

PS:

如果您有兴趣,此链接将讨论“DDL”、“DML”和相关的首字母缩略词:

于 2013-02-05T06:21:41.313 回答
1

我认为对这个问题有两种不同的解释,我想确保两者都得到回答和最终证明,因为这仍然是sqlite drop table rollback的顶级搜索结果(并且指向 SQLite 文档的链接似乎也具有误导性)。

对于第一个问题,您可以回滚事务范围内发生的删除表 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 命令行 shell 的相同行为:

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 tabledrop table命令都已回滚。另一种说法是,对于 Oracle 中存在的可以回滚的操作,SQLite 不受相同的 DML/DDL 区别的约束。

对于问题的第二种解释,即,我可以恢复一个在事务范围之外删除的表(这也需要您作为开发人员以及灾难恢复可能拥有的“哦 S#%T”经验),对 SQ Lite 文档的引用是适当的:

删除的表从数据库模式和磁盘文件中完全删除。该表无法恢复。与表关联的所有索引和触发器也将被删除。

于 2018-09-05T22:47:12.200 回答