在Android SQLite中,我有一个表MyTable
。我在升级数据库后丢失了它。
如果可能的话,我该如何回滚掉落的桌子。
任何好的答案都会被接受。
感谢。
答案 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)
删除表不是可恢复的操作,除非作为回滚事务的一部分执行(对于您的特定情况,似乎不是)。
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 table
和drop table
命令都已回滚。换句话说,SQLite不受Oracle中存在的可以回滚的操作相同的DML / DDL区分的约束。
对于问题的第二种解释,即,我是否可以恢复在事务范围之外删除的表(这也将带来您作为开发人员以及灾难恢复可能拥有的“ Oh S#%T”经验),则对SQ Lite文档的引用是适当的:
已删除的表已从数据库架构和磁盘文件中完全删除。该表无法恢复。与该表关联的所有索引和触发器也将被删除。