我想知道在运行SQL时到底发生了什么:
UPDATE pgbench_accounts
SET filler = 'test'
WHERE aid = NULL;
在这种情况下,PostgreSQL会进行seq扫描吗?解释分析因PostgreSQL版本而异。 在9.3看起来像:
"Update on pgbench_accounts (cost=0.00..6266.00 rows=1 width=26) (actual time=0.002..0.002 rows=0 loops=1)"
" -> Result (cost=0.00..6266.00 rows=1 width=26) (actual time=0.000..0.000 rows=0 loops=1)"
" One-Time Filter: NULL::boolean"
" -> Seq Scan on pgbench_accounts (cost=0.00..6266.00 rows=1 width=26) (never executed)"
但是在之前的版本中缺少“(从未执行过)”,如果运算符错误,PostgreSQL是否足够聪明,不能执行扫描?
答案 0 :(得分:0)
如果您希望它在参数为空时更新所有行
update pgbench_accounts
set filler = 'test'
where aid = :parameter or :parameter is null;
如果您想要的是将null视为共同值
update pgbench_accounts
set filler = 'test'
where aid is not distinct from :parameter;