UPDATE 構文

単一テーブル構文:

UPDATE [LOW_PRIORITY] [IGNORE] tbl_name
    SET col_name1=expr1 [, col_name2=expr2 ...]
    [WHERE where_condition]
    [ORDER BY ...]
    [LIMIT row_count]

複合テーブル構文:

UPDATE [LOW_PRIORITY] [IGNORE] table_references
    SET col_name1=expr1 [, col_name2=expr2 ...]
    [WHERE where_condition]

単一テーブル構文には、UPDATE ステートメントは新しい値を利用して tbl_name 内に既存行のカラムを更新します。SET 条項は、どのカラムを変更し、それらにはどの値が与えられるべきかという事を指示します。もし WHERE 条項が与えられたら、それはどの行を更新するべきかを決定します。WHERE 条項が無ければ、全ての行が更新されます。もし ORDER BY 条項が指定されると、指定された順に行が更新されます。LIMIT 条項は、更新できる行数に制限を設定します。

複合テーブル構文には、UPDATE が、条件を満たす table_references で名づけられたそれぞれのテーブルの行を更新します。この場合、ORDER BYLIMIT を利用する事はできません。

where_condition は更新される各行に対して正しい結果の式です。それは 項 「SELECT 構文」 で述べられている通りに指定されます。

UPDATE ステートメントは次の修飾因子をサポートします。

もし式の中で 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 BYLIMIT を利用する事はできません。table_references 条項は接合箇所に含まれるテーブルをリストします。その構文は 項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 性能に頼ってください。

詳しくは 項4. 「FOREIGN KEY 制約」 を参照してください。

現在は、サブクエリの中で1つのテーブルを更新し、同じテーブルから選択する事はできません。