如何在PostgreSQL中测试运行UPDATE语句?
例如,如何测试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
有没有一种方法可以很容易地模拟它?将它包装在一个容器中,在最后使用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正在避免提交任何更改