単一テーブル構文:
UPDATE [LOW_PRIORITY] [IGNORE]tbl_name
SETcol_name1
=expr1
[,col_name2
=expr2
...] [WHEREwhere_condition
] [ORDER BY ...] [LIMITrow_count
]
複合テーブル構文:
UPDATE [LOW_PRIORITY] [IGNORE]table_references
SETcol_name1
=expr1
[,col_name2
=expr2
...] [WHEREwhere_condition
]
単一テーブル構文には、UPDATE
ステートメントは新しい値を利用して
tbl_name
内に既存行のカラムを更新します。SET
条項は、どのカラムを変更し、それらにはどの値が与えられるべきかという事を指示します。もし
WHERE
条項が与えられたら、それはどの行を更新するべきかを決定します。WHERE
条項が無ければ、全ての行が更新されます。もし
ORDER BY
条項が指定されると、指定された順に行が更新されます。LIMIT
条項は、更新できる行数に制限を設定します。
複合テーブル構文には、UPDATE
が、条件を満たす
table_references
で名づけられたそれぞれのテーブルの行を更新します。この場合、ORDER
BY
と LIMIT
を利用する事はできません。
where_condition
は更新される各行に対して正しい結果の式です。それは
項12.2.7. 「SELECT
構文」
で述べられている通りに指定されます。
UPDATE
ステートメントは次の修飾因子をサポートします。
もし LOW_PRIORITY
キーワードを利用すると、別のクライアントがテーブルからの読み込みをしなくなるまで、UPDATE
の実行が遅れます。
もし IGNORE
キーワードを利用すると、更新中にエラーが発生しても更新ステートメントは異常終了しません。複製キーの矛盾が起きた行は更新されません。データ変換エラーを起こす値にカラムが更新された行は、代わりに一番近い有効値に更新されます。
もし式の中で tbl_name
からカラムにアクセスするなら、UPDATE
はカラムの現在の値を利用します。例えば、次のステートメントは
age
カラムを現在の値よりも1大きく設定します。
UPDATE persondata SET age=age+1;
単一テーブル UPDATE
割り当ては通常左から右に評価されます。複合テーブルの更新に関しては、割り当てが特定の順番で行われるという保証はありません。
もし現在カラムが持つ値に設定するなら、MySQL はそれに気づくので更新はしません。
NULL
に設定する事で NOT
NULL
を宣言されたカラムを更新すると、カラムはそのデータ
タイプに適切なデフォルト値に設定され、警告カウントはインクリメントされます。数値タイプ、文字列タイプの空の文字列(''
)、そして日付と時刻タイプの「ゼロ」
値のデフォルト値は 0
です。
UPDATE
は実際に変更された行数を返します。mysql_info()
C API
関数は、一致し更新された行数と、UPDATE
の最中に起きた警告数を返します。
UPDATE
の領域を制限する為に
LIMIT
を利用する事ができます。row_count
LIMIT
条項は行に一致した制限です。ステートメントは、実際に変更されたかどうかに関わらず、WHERE
条項の条件を満たす row_count
行を見付けるとすぐに止まります。
もし UPDATE
ステートメントが
ORDER BY
条項を含むなら、行は条項に指示された順番で更新されます。これは、エラーが起こるかもしれない特定の場合に有効です。テーブル
t
が固有インデックスを持つカラム
id
を含むと仮定してください。次のステートメントは、行が更新される順番によって、複製キー
エラーとなり失敗するかもしれません。
UPDATE t SET id = id + 1;
例えば、もしテーブルが id
カラム内に1と2を含み、2が3に更新される前に1が2に更新されると、エラーが起きます。
この問題を防ぐには、大きい id
値を持つ行が、小さい値を持つ行よりも先に更新されるように
ORDER BY
条項を追加してください。
UPDATE t SET id = id + 1 ORDER BY id DESC;
複合テーブルをカバーする UPDATE
演算を行う事もできます。.しかし、複合テーブル
UPDATE
と共に ORDER BY
や LIMIT
を利用する事はできません。table_references
条項は接合箇所に含まれるテーブルをリストします。その構文は
項12.2.7.1. 「JOIN
構文」
で説明されています。ここに1つ例があります。
UPDATE items,month SET items.price=month.price WHERE items.id=month.id;
前出の例はカンマ演算子を利用する内部接合を表しますが、複合テーブルの
UPDATE
ステートメントは、LEFT JOIN
のような、SELECT
ステートメント内で許容される接合タイプを利用する事ができます。
実際に更新された複合テーブル
UPDATE
の中で参照されたカラムに対してだけ、UPDATE
権限が必要です。読み込みはされても、変更はされないカラムには、SELECT
権限だけが必要です。
外部キー制限があるテーブルに
InnoDB
テーブルを含む複合テーブル
UPDATE
ステートメントを利用すると、MySQL
のオプチマイザは、それらの親子関係の順番と違う順番でテーブルを処理するかもしれません。この場合、ステートメントは失敗し、ロールバックされます。代わりに、単一テーブルを更新し、他のテーブルが適宜修正されるように
InnoDB
が働きかける ON
UPDATE
性能に頼ってください。
詳しくは 項13.5.6.4. 「FOREIGN KEY
制約」
を参照してください。
現在は、サブクエリの中で1つのテーブルを更新し、同じテーブルから選択する事はできません。