我该如何测试一个更新语句,例如检查它是否有效,是否会实际更新行等?
有没有一种简单模拟的方法呢?
我该如何测试一个更新语句,例如检查它是否有效,是否会实际更新行等?
有没有一种简单模拟的方法呢?
使用事务将您的更新语句和选择查询(用于测试更新)包装起来,然后始终回滚。
示例:
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!
一次事务通常以提交结束,但由于您只是在测试,不希望更改永久生效,因此您只需要回滚操作。
将它包装在一个事务中,在最后使用SELECT测试结果并回滚。
BEGIN;
UPDATE ...;
SELECT ...;
ROLLBACK;
COMMIT
而不是ROLLBACK
。 - n.stUPDATE
命令前加上 EXPLAIN
[ref],它将不会执行实际的更新。例如:EXPLAIN UPDATE accounts SET balance = balance + 100.00 WHERE name = 'Alice';
WHERE
子句匹配。在上面的例子中,这两个数字是相同的。使用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;
考虑到这个简单的更新:
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语句运行相同的检查:SELECT返回的行将是UPDATE修改的行。