82237


値が'0'の時だけ''にしたいと思い、「UPDATE SET WHERE」と「UPDATE SET
REPLACE」を試したらいずれでも更新できたのですが、両者は何が異なるのですか？ 単なるエイリアスですか？ どういう風に使い分けるのですか？

[code]

    UPDATE
      `t`
    SET
      `t`.`hoge` =''
    WHERE
      `t`.`hoge` = '0'
    
    
    
    UPDATE
      `t`
    SET
      `t`.`hoge` = REPLACE(`hoge`,0,'');
    
[/code]

質問背景  
SQL構文エラーになった際、書き方が悪いのか、そもそもこんな構文はないのかいつも迷います。

環境  
MySQL5.7


CC BY-SA 4.0
2021-09-04T12:28:46.593
82236
2021-09-05T02:37:38.863
7886
question
mysql
MySQLで、条件一致した時だけ値を更新したい場合、「UPDATE SET WHERE」と「UPDATE SET REPLACE」では何が異なるのですか？


単純にwhere句で処理対象のレコードを絞るかテーブルの全レコードに対して更新処理するかの違いです。

例えば下記のレコードがあった場合…

id | hoge  
---|---  
1 | 0  
2 | 1  
3 | 0  
4 | 2  
  
前者のwhere句を使ったSQLでは、最初にwhere句で更新対象を`id`が1,3の行に絞ってから **2レコードのみ** 更新処理を行います。

id | hoge  
---|---  
1 | 0  
2 | 1  
3 | 0  
4 | 2  
  
後者のwhere句を用いない処理では`id`が1から4まで全レコードに対して更新処理を行います。  
例え更新後の結果が更新前と同一であっても、内部的には各レコードすべてが上書きされます。  
(つまり`id`2,4はそれぞれ元の値と同じ1,2が代入されます)

実際に[row_count()](https://dev.mysql.com/doc/refman/5.6/ja/information-
functions.html#function_row-count)を使って更新件数を確認すると、後者は全レコードが更新されていることが分かります。  
[DB Fiddle](https://www.db-fiddle.com/f/8cXoGwP5WhtLwbStn5QQMa/0)

通常は両方を使い分けるのではなく前者を使用してください。  
後者は[テーブルの完全スキャン](https://dev.mysql.com/doc/refman/5.6/ja/glossary.html#glos_full_table_scan)が発生してDB負荷が高いので明確な理由がなければ使う意味がありません。


CC BY-SA 4.0
2021-09-04T12:51:29.680
82237
2021-09-05T02:37:38.863
2021-09-05T02:37:38.863
9820
9820
82236
answer