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 行を変更する
- Matched と Changed は別のものを数える
同じ文をもう一度実行します。
WHERE は依然としてその行を見つけたため、Rows matched は 1 です。行は既に
0 を保持していたため、何も書き込まれず、Changed は 0 です。2 つの数を
一緒に読んでください。matched 0 は WHERE が何も見つけなかったという意味で、
changed 0 とは別の問題です。changed 0 は、行が既に持っている値を指定した
という意味です。
- 複数の列を一度に変更する
代入は 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は保護が仕事をしているものとして読みます。