SQLIte DROP表ROLL返回

时间:2013-02-05 06:19:06

标签: android sqlite

在Android SQLite中,我有一个表MyTable。我在升级数据库后丢失了它。

如果可能的话,我该如何回滚掉落的桌子。

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

感谢。

3 个答案:

答案 0 :(得分:4)

澄清:

虽然您可以提交或回滚DML语句,例如“insert”或“delete”(如果您在事务中执行此操作),通常您不能回滚DDL语句,如“alter table”或“drop table”。

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

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

否则(根据sqlite手册):

        

DROP TABLE语句删除添加了CREATE TABLE的表   声明。指定的名称是表名。丢弃的表是   完全从数据库架构和磁盘文件中删除。该   表无法恢复。与之相关的所有指数和触发器   该表也被删除。

PS:

此链接讨论“DDL”,“DML”及相关缩略语,如果您有兴趣:

答案 1 :(得分:3)

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

来自SQLite documentation

  

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;

这表明该表在回滚后仍然存在。如果你提交而不是回滚(或者如果你完全删除了交易控制),表已经死了,已经过期,去见了它的制造商,拖着这个致命的线圈,<在这里插入你最喜欢的比喻>。

所以,既然没有作为回滚事务的一部分来做(事实上表已经实际上已经消失了),你将会需要从头开始重新创建它(或者如果可能的话,从备份中重新创建)。

答案 2 :(得分:0)

我认为此问题有两种不同的解释,我想确保两者均得到答案并得到论证,因为这仍然是 sqlite删除表回滚的顶部搜索结果(以及指向该链接的链接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命令行外壳的相同行为:

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命令都已回滚。换句话说,SQLite不受Oracle中存在的可以回滚的操作相同的DML / DDL区分的约束。

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

  

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