単一テーブル構文:
UPDATE [LOW_PRIORITY] [IGNORE]table_reference
SETcol_name1
={expr1
|DEFAULT} [,col_name2
={expr2
|DEFAULT}] ... [WHEREwhere_condition
] [ORDER BY ...] [LIMITrow_count
]
複合テーブル構文:
UPDATE [LOW_PRIORITY] [IGNORE]table_references
SETcol_name1
={expr1
|DEFAULT} [,col_name2
={expr2
|DEFAULT}] ... [WHEREwhere_condition
]
単一テーブル構文の場合、UPDATE
ステートメントは、新しい値を持つ指定されたテーブル内の既存の行のカラムを更新します。SET
節は、どのカラムを変更し、それらにはどの値が与えられるべきかということを指示します。各値は式、またはカラムを明示的にデフォルト値に設定するキーワード
DEFAULT
として指定できます。もし
WHERE
節が与えられたら、それはどの行を更新するべきかを決定します。WHERE
節が無ければ、すべての行が更新されます。もし
ORDER BY
節が指定されると、指定された順に行が更新されます。LIMIT
節は、更新できる行数に制限を設定します。
複合テーブル構文には、UPDATE
が、条件を満たす
table_references
で名づけられたそれぞれのテーブルの行を更新します。この場合、ORDER
BY
と LIMIT
を利用することはできません。
where_condition
は更新される各行に対して正しい結果の式です。
table_references
と
where_condition
は、項8.2.8. 「SELECT
構文」
で説明されているように指定されます。
実際に更新された、UPDATE
内で参照されているカラムに対してのみ
UPDATE
権限が必要です。読み込みはされても、変更はされないカラムには、SELECT
権限だけが必要です。
UPDATE
ステートメントは次の修飾子をサポートします。
もし LOW_PRIORITY
キーワードを利用すると、別のクライアントがテーブルからの読み込みをしなくなるまで、UPDATE
の実行が遅れます。これは、テーブルレベルロックのみを使用するストレージエンジン
(MyISAM
、MEMORY
、MERGE
)
にのみ影響を与えます。
もし IGNORE
キーワードを利用すると、更新中にエラーが発生しても更新ステートメントは異常終了しません。重複キーの矛盾が起きた行は更新されません。データ変換エラーを起こす値にカラムが更新された行は、代わりに一番近い有効値に更新されます。
式で更新されるテーブルのカラムにアクセスする場合、UPDATE
はそのカラムの現在の値を使用します。たとえば、次のステートメントは
age
カラムを現在の値よりも 1 大きく設定します。
UPDATE persondata SET age=age+1;
単一テーブル
UPDATE
割り当ては通常左から右に評価されます。複合テーブルの更新に関しては、割り当てが特定の順番で行われるという保証はありません。
もし現在カラムが持つ値に設定するなら、MySQL はそれに気づくので更新はしません。
NOT NULL
として宣言されているカラムを
NULL
に設定することによって更新すると、厳密な SQL
モードが有効になっている場合は、エラーが発生します。そうでない場合、カラムはそのカラムデータ型の暗黙のデフォルト値に設定され、警告数が
1
増やされます。暗黙のデフォルト値は、数値型では
0
、文字列型では空の文字列
(''
)、日付と時刻型では「ゼロ」の値です。
項6.1.4. 「データ型デフォルト値」
を参照してください。
UPDATE
は実際に変更された行数を返します。mysql_info()
C API
関数は、一致し更新された行数と、UPDATE
の最中に起きた警告数を返します。
LIMIT
を使用すると、row_count
UPDATE
のスコープを制限できます。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
節は結合箇所に含まれるテーブルをリストします。その構文は
項8.2.8.1. 「JOIN
構文」 で説明されています。ここに 1
つ例があります。
UPDATE items,month SET items.price=month.price WHERE items.id=month.id;
前出の例はカンマ演算子を利用する内部結合を表しますが、複合テーブルの
UPDATE
ステートメントは、LEFT
JOIN
のような、SELECT
ステートメント内で許容される結合型を利用することができます。
外部キー制限があるテーブルに
InnoDB
テーブルを含む複合テーブル
UPDATE
ステートメントを利用すると、MySQL
のオプティマイザは、それらの親子関係の順番と違う順番でテーブルを処理するかもしれません。この場合、ステートメントは失敗し、ロールバックされます。代わりに、単一テーブルを更新し、ほかのテーブルが適宜修正されるように
InnoDB
が働きかける
ON UPDATE
性能に頼ってください。項9.4.4. 「FOREIGN KEY
制約」
を参照してください。
現在は、サブクエリーの中で 1 つのテーブルを更新し、同じテーブルから選択することはできません。
インデックスヒント (項8.2.8.2. 「インデックスヒントの構文」
を参照)
は受け入れられますが、UPDATE
ステートメントに対して無視されます。