読者です 読者をやめる 読者になる 読者になる

set setting reset

インフラ関連の小ネタと備忘録

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 が含まれている行のみでした。