【问题标题】:Rollback DML statement in pgAdminpgAdmin 中的回滚 DML 语句
【发布时间】:2012-03-29 00:32:34
【问题描述】:

在 pgAdmin 中,如果我执行插入查询,我看不到任何提交或回滚我刚刚运行的语句的方法(我知道它会自动提交)。我习惯了 Oracle 和 SQL 开发人员,我可以在其中运行一条语句,然后通过按一下按钮回滚我运行的最后一条语句。我如何在这里实现同样的目标?

【问题讨论】:

    标签: postgresql pgadmin


    【解决方案1】:

    在 SQL 窗口中使用事务:

    BEGIN;
    DROP TABLE foo;
    ROLLBACK; -- or COMMIT;
    

    -- 编辑-- 另一个例子:

    BEGIN;
    INSERT INTO foo(bar) VALUES ('baz') RETURNING bar; -- the results will be returned
    SELECT * FROM other_table; -- some more result
    UPDATE other_table SET var = 'bla' WHERE id = 1 RETURNING *; -- the results will be returned
    
    -- and when you're done with all statements and have seen the results:
    ROLLBACK; -- or COMMIT 
    

    【讨论】:

    • hmm,如果我在开始和回滚之间进行插入,我应该期望能够看到表数据中的变化吗?还是不支持?
    • 当然支持,这是数据库的正常行为。
    【解决方案2】:

    我也亲爱的更喜欢 Oracle 将所有内容自动放入事务的方式,以帮助避免灾难性的手动错误。

    Enterprise 产品(IMO)中默认启用自动提交功能是非常邪恶的,只不过是完全、完全疯狂 设计选择 :(

    无论如何 --- 使用 Postgres,总是需要记住

    开始;

    在手动工作或 sql 脚本开始时。

    作为一个实际的习惯:那么,当你说:COMMIT; 在 Oracle 中,我使用该行

    结束;开始;

    在 Postgres 中做同样的事情,即提交当前事务并立即开始一个新事务。


    当使用 JDBC 或类似方法时,要创建连接,请始终使用某种方法,例如getPGConnection(),其中包括:

    ...
    Connection dbConn = DriverManager.getConnection(dbUrl, dbUser, dbPassword);
    dbConn.setAutoCommit(false);
    ...
    

    确保每个连接都禁用了自动提交。

    【讨论】:

      【解决方案3】:

      如果您使用的是 pgAdmin4,您可以打开和关闭自动提交和/或自动回滚。

      转到文件下拉菜单并选择首选项选项。在 SQL 编辑器选项卡 -> 选项中,您可以看到打开和关闭自动提交/回滚的选项。

      Auto commit/rollback option

      【讨论】:

      • 这回答了问题,但我已经放弃了 pgadmin。 V4 太糟糕了,各地的 postgres 用户都在寻找更好的选择。我已经选择了 dbeaver - dbeaver.com
      猜你喜欢
      • 2020-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-10
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多