是否有可能在主要SQL数据库中回滚CREATE TABLE和ALTER TABLE语句?

我正在开发一个发行DDL的程序。 我想知道是否可以回滚CREATE TABLE和类似的DDL

  • Postgres的
  • MySQL的
  • SQLite的
  • 等人

描述每个数据库如何处理DDL事务。

http://wiki.postgresql.org/wiki/Transactional_DDL_in_PostgreSQL:_A_Competitive_Analysis从PostgreSQL的angular度提供了这个问题的概述。;

根据这个文件是DDL交易吗?

  • PostgreSQL – 是的
  • MySQL – 没有; DDL导致一个隐含的提交
  • Oracle数据库11g第2版及更高版本 – 缺省情况下,不存在,但存在称为基于版本的重定义的替代方法
  • 旧版本的Oracle – 不行; DDL导致一个隐含的提交
  • SQL Server – 是的
  • Sybase Adaptive Server – 是的
  • DB2 – 是的
  • Informix – 是的
  • 火鸟(Interbase) – 是的

SQLite也似乎有事务性的DDL。 我能够在SQLite中ROLLBACK CREATE TABLE语句。 它的CREATE TABLE文档没有提到任何特殊的事务性“陷阱”。

PostgreSQL对大多数数据库对象(当然是表,索引等,但不是数据库,用户)有事务性的DDL。 然而实际上任何DDL都会在目标对象上获得一个ACCESS EXCLUSIVE锁,使得它完全无法访问,直到DDL事务完成。 另外,不是所有的情况都是相当的处理,例如,如果您尝试从表fooselect另一个事务正在删除它并创buildreplace表foo ,则被阻止的事务将最终收到错误,而不是find新的foo表。 (编辑:这是在PostgreSQL 9.3之前或之前修复的)

CREATE INDEX ... CONCURRENTLY是个例外,它使用三个事务向一个表添加一个索引,同时允许并发更新,所以它本身不能在事务中执行。

此外,数据库维护命令VACUUM不能在事务中使用。

尽pipe并不是严格意义上的“回滚”,但在Oracle中,如果数据库已configuration为支持,则可使用FLASHBACK命令撤消这些types的更改。

用MySQL似乎无法做到,很愚蠢..

“InnoDB中的CREATE TABLE语句作为单个事务来处理,这意味着来自用户的ROLLBACK不会撤销用户在该事务中创build的CREATE TABLE语句。

https://dev.mysql.com/doc/refman/5.7/en/implicit-commit.html

尝试了几种不同的方式,它不会回滚..

解决方法是简单地设置一个失败标志,如果其中一个查询失败,则执行“drop table tblname”。