【发布时间】:2012-03-01 09:37:44
【问题描述】:
我如何测试一条 UPDATE 语句以查看它是否可以工作,例如它是否真的会更新行等?
有没有办法轻松模拟?
【问题讨论】:
-
有没有办法轻松模拟?
标签: sql database postgresql
我如何测试一条 UPDATE 语句以查看它是否可以工作,例如它是否真的会更新行等?
有没有办法轻松模拟?
【问题讨论】:
标签: sql database postgresql
使用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!
事务通常以提交结束,但由于您只是在测试并且不希望更改是永久性的,因此您只需回滚即可。
【讨论】:
将其包装在 transaction 中,使用 SELECT 测试结果并在最后回滚。
BEGIN;
UPDATE ...;
SELECT ...;
ROLLBACK;
【讨论】:
COMMIT 而不是ROLLBACK。
您总是可以在SQL Fiddle 上建立一个示例数据库并在那里尝试您的更新语句。
完全披露:我是 sqlfiddle.com 的作者
【讨论】:
在你的 SQL UPDATE 命令前面加上EXPLAIN,它会告诉你有多少行会受到你的命令的影响。
这比将命令包装在事务中要简单得多。
【讨论】:
您可以使用一个工具来获取数据库的快照并轻松回滚到它。 我推荐OffScale - 它基本上是用于数据库的 git。
【讨论】:
使用 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;
【讨论】:
首先使用 SELECT 语句运行相同的检查:SELECT 返回的行将是 UPDATE 修改的行
【讨论】:
鉴于这个简单的更新:
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;
【讨论】: