Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PostgreSQL中测试运行UPDATE语句?_Sql_Database_Postgresql - Fatal编程技术网

如何在PostgreSQL中测试运行UPDATE语句?

如何在PostgreSQL中测试运行UPDATE语句?,sql,database,postgresql,Sql,Database,Postgresql,例如,如何测试UPDATE语句以查看它是否有效,例如它是否实际更新行等 有没有一种方法可以很容易地模拟它?将它包装在一个容器中,在最后使用SELECT和rollback测试结果 BEGIN; UPDATE ...; SELECT ...; ROLLBACK; 首先使用SELECT语句运行相同的检查:SELECT返回的行将是UPDATE修改的行,使用包装UPDATE语句和SELECT查询测试更新,然后始终回滚 例如: BEGIN; UPDATE accounts SET balance

例如,如何测试UPDATE语句以查看它是否有效,例如它是否实际更新行等


有没有一种方法可以很容易地模拟它?

将它包装在一个容器中,在最后使用SELECT和rollback测试结果

BEGIN;

UPDATE ...;

SELECT ...;

ROLLBACK;

首先使用SELECT语句运行相同的检查:SELECT返回的行将是UPDATE修改的行,使用包装UPDATE语句和SELECT查询测试更新,然后始终回滚

例如:

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!

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

您始终可以在上面建立一个示例数据库,并在那里尝试更新语句


充分披露:我是sqlfiddle.com的作者,给出了以下简单的更新:

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;
事实上,我会积极地运用大脑进行分析,更像这样:

 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;

您可以使用一个工具,它允许您拍摄数据库的快照并轻松回滚到它。
我推荐-它基本上是用于数据库的git。

对于Postgres,您可以使用UPDATE子句返回以显示哪些行已被修改

-- 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;

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

有没有办法轻松模拟它?这还不够。可能有FKs,检查约束。。。一个简单的选择不会成功。SELECT只会测试WHERE子句,但即使SELECT成功,更新也可能失败。您可以在更新查询中使用RETURNING跳过SELECT查询。如果您决定保留更改,请使用COMMIT而不是ROLLBACK。@FrankHeikens您应该将其扩展为一个答案,非常有用!主页上说,这只适用于MySQL,或者至少没有关于如何使用不同版本配置它的文档DBMS@Sgnl现在看来,Rollback正在避免提交任何更改