PostgreSQL で UPDATE REPLACE する時にちょっと怖かった
こんな感じのテーブルがあるとします。
select count(*) from table ; count ------ 1000
a
が含まれているレコードが 10 あるとします。
select count(*) from table where column like '%a%'; count ------ 10
replace してみます。
BEGIN; UPDATE table SET column = REPLACE(column, 'a', 'b'); UPDATE 1000
a
にマッチするのは 10 件のはずなのに、全件 UPDATE しています。
select count(*) from table where column like '%a%'; count ------ 0
目的は果たせているようですが、他に影響でていたらいやなので慌てて rollback します。
select count(*) from table where column like '%a%'; count ------ 10
結論としては普通に WHERE 句を指定していないから全件走査するようでした。(そりゃそうか)
BEGIN; UPDATE table SET column = REPLACE(column, 'a', 'b') WHERE column like '%a%'; UPDATE 10
WHERE句なしの時は全カラム走査して、検索条件にマッチすれば更新するという挙動のようです。
UPDATE 1000 と表示されても実際に影響があったのは a
が含まれている行のみでした。