【问题标题】:How to test run an UPDATE statement in PostgreSQL?如何在 PostgreSQL 中测试运行 UPDATE 语句?
【发布时间】:2012-03-01 09:37:44
【问题描述】:

我如何测试一条 UPDATE 语句以查看它是否可以工作,例如它是否真的会更新行等?

有没有办法轻松模拟?

【问题讨论】:

  • 有没有办法轻松模拟?

标签: sql database postgresql


【解决方案1】:

使用transaction 包装您的更新语句和选择查询(以测试更新),然后始终回滚。

例子:

BEGIN;

UPDATE accounts SET balance = balance - 100.00
    WHERE name = 'Alice';

SELECT balance FROM accounts WHERE name = 'Alice';

ROLLBACK; -- << Important! Un-does your UPDATE statement above!

事务通常以提交结束,但由于您只是在测试并且不希望更改是永久性的,因此您只需回滚即可。

【讨论】:

    【解决方案2】:

    将其包装在 transaction 中,使用 SELECT 测试结果并在最后回滚。

    BEGIN;
    
    UPDATE ...;
    
    SELECT ...;
    
    ROLLBACK;
    

    【讨论】:

    • 您可以在 UPDATE 查询中使用 RETURNING 来跳过 SELECT 查询。
    • 如果您决定保留更改,请使用COMMIT 而不是ROLLBACK
    • @FrankHeikens 您应该将其扩展为答案,非常有用!
    【解决方案3】:

    您总是可以在SQL Fiddle 上建立一个示例数据库并在那里尝试您的更新语句。

    完全披露:我是 sqlfiddle.com 的作者

    【讨论】:

      【解决方案4】:

      在你的 SQL UPDATE 命令前面加上EXPLAIN,它会告诉你有多少行会受到你的命令的影响。

      这比将命令包装在事务中要简单得多。

      【讨论】:

        【解决方案5】:

        您可以使用一个工具来获取数据库的快照并轻松回滚到它。 我推荐OffScale - 它基本上是用于数据库的 git。

        【讨论】:

        • 主页说这只适用于 MySQL - 或者至少没有关于如何使用不同的 DBMS 配置它的文档
        【解决方案6】:

        使用 Postgres,您可以使用 UPDATE 子句 RETURNING 来显示哪些行已被修改。

        -- example data
        CREATE TABLE data(id int, text text);
        INSERT INTO DATA VALUES(1,'aaa'),(2,'bbb'),(3,'ccc'),(4,'ddd');
        
        -- original data
        SELECT * from data;
        
        -- dry-run update
        BEGIN;
        
        UPDATE
          data
        SET
          text = 'modified'
        WHERE
          id > 2
        RETURNING
          id, text;
        
        ROLLBACK;
        
        -- data after dry-run update
        SELECT * from data;
        

        【讨论】:

        • 回滚是为了避免提交任何更改
        【解决方案7】:

        首先使用 SELECT 语句运行相同的检查:SELECT 返回的行将是 UPDATE 修改的行

        【讨论】:

        • 不够。可能存在 FK、CHECK 约束……简单的 SELECT 不会命中。 SELECT 只会测试 WHERE 子句,但即使 SELECT 成功,UPDATE 也可能失败。
        【解决方案8】:

        鉴于这个简单的更新:

        UPDATE Products
           SET price_including_vat = price * 1.05
         WHERE product_type = 'Food';
        

        我会用这样的东西来测试它:

         SELECT price_including_vat AS price_including_vat__before, 
                price * 1.05 AS price_including_vat__after, 
                *
           FROM Products
         WHERE product_type = 'Food';
        

        实际上,我可能会像这样使用大脑并进行分析:

        WITH updated AS 
           (
            SELECT price_including_vat AS price_including_vat__before, 
                   price * 1.05 AS price_including_vat__after, 
                   *
              FROM Products
            WHERE product_type = 'Food'
           )
        SELECT * 
          FROM updated
         WHERE price_including_vat__before = price_including_vat__after;
        

        【讨论】:

          猜你喜欢
          • 2012-06-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-11-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多