メインコンテンツへスキップ

VillageSQL is a drop-in replacement for MySQL with extensions.

All examples on this page work on VillageSQL. Install Now →
UPDATE は既にある行を変更します。どの行かは WHERE が決め、1 行とテーブル 全体を隔てているのは WHERE だけです。 これらの例は、INSERT の sakila_practice データベースを 使います。始める前にそこにあるセットアップのブロックをもう一度実行し、次に mysql -u root -p sakila_practice でクライアントを開いてください。

UPDATE の仕組み

TABLE_NAME をテーブルに、COLUMN_NAME を変更する列に、NEW_VALUE をそこに 入れる値に、CONDITION を行を選ぶテストに置き換えます。 WHERE は SELECT の場合とまったく同じように動作し、それが UPDATE を書く 最も安全な方法です。まず SELECT として実行し、行を確認し、それから SELECT ... を UPDATE ... SET ... に変え、WHERE はそのままにします。

例

  1. 1 行を変更する

  1. Matched と Changed は別のものを数える

同じ文をもう一度実行します。
WHERE は依然としてその行を見つけたため、Rows matched は 1 です。行は既に 0 を保持していたため、何も書き込まれず、Changed は 0 です。2 つの数を 一緒に読んでください。matched 0 は WHERE が何も見つけなかったという意味で、 changed 0 とは別の問題です。changed 0 は、行が既に持っている値を指定した という意味です。

  1. 複数の列を一度に変更する

代入は AND ではなくカンマで区切ります。

UPDATE は INSERT と同じ制約を受ける

別の行が保持している値を UNIQUE 列に移すと、同じように失敗し、行は元の値を 保持します。

WHERE がないとすべての行が変わる

確認のステップはありません。文は実行され、テーブル内のすべての行が新しい値を 取ります。 セッションの設定でこの形を拒否させることができます。セーフアップデートモードは、 WHERE でキー列をテストせず、LIMIT も付けていない UPDATE または DELETE を 拒否します。このモードは、要求しない限りオフです。
最初の文からこの保護を得るには、mysql -u root -p --safe-updates sakila_practice でクライアントを起動します。このフラグはこの 1 つの変数を設定する以上のことを します。sql_select_limit によって SELECT を 1,000 行に制限し、max_join_size によって結合を制限するため、大きなテーブルに対する読み取りは、何も言わずに 途中で打ち切られて返ってきます。ERROR 1175 は、保護があなたを止めたという意味です。 文が本当にすべての行に触れることを意図しているときは、もう一度オフにします。
保護をオフにすると、文は実行されます。
Rows matched: 3 Changed: 2 となるのは、1 人のメンバーが既にアクティブだった ためです。 テーブル全体の更新がまさに正しいこともあります。すべての残高を 5% 上げるのは 1 つの文で、新しい値は古い値から計算されます。
balance = balance * 1.05 は各行の現在の値を読むため、すべての行がそれぞれ 自分の答えを得ます。

まとめ

  • 既存の行を変更するには UPDATE table SET column = value WHERE condition と書きます。
  • まず WHERE を SELECT として実行し、それから文の先頭だけを変えます。
  • Rows matched と Changed は 2 つの別々の事実として読みます。
  • 複数の代入はカンマで区切ります。
  • UPDATE は INSERT と同じ UNIQUE と NOT NULL の規則に当たると考えてください。
  • セーフアップデートモードをオンにし、ERROR 1175 は保護が仕事をしているものとして読みます。

関連項目