単一テ,ブル構文:
更新[low_priority] [ignore]table_reference集col_name1= {expr1|默认}(,col_name2= {expr2|默认}]…(在哪里where_condition[按…订购]][限制row_count]
複数テ,ブル構文:
更新[low_priority] [ignore]table_references集col_name1= {expr1|默认}(,col_name2= {expr2|默认}]…(在哪里where_condition]
単一テ,ブル構文の場合,更新
ステ,トメントは,指定されたテ,ブル内の既存の行のカラムを新しい値に更新します。集
句は,変更するカラムと,それらのカラムに指定される値を示します。各値は式か,またはカラムを明示的にそのデフォルト値に設定するキ,ワ,ド默认的
として指定できます。在哪里
句(指定されている場合)は,どの行を更新するかを識別する条件を指定します。在哪里
句がない場合は,すべての行が更新されます。命令
句が指定されている場合は,指定されている順序で行が更新されます。限制
句は,更新できる行数に制限を設定します。
複数テ,ブル構文の場合,更新
は,条件を満たすtable_references
で指定されている各テ,ブル内の行を更新します。一致した各行は,条件に複数回一致した場合でも,1回更新されます。複数テ,ブル構文の場合は,命令
および限制
を使用できません。
パーティション化されたテーブルの場合は,このステートメントの単一テーブルと複数テーブルの両方の形式で,テーブル参照の一部としての分区
オプションの使用がサポ,トされます。このオプションは1つ以上のパーティションまたはサブパーティション(またはその両方)のリストを受け取ります。リストされているパーティション(またはサブパーティション)だけが一致をチェックされ,これらのパーティションまたはサブパーティションのいずれにも存在しない行は,where_condition
を満たすかどうかにかかわらず更新されません。
插入
または取代
ステ,トメントで分区
を使用している場合とは異なり,それ以外は有効な更新……分区
ステ,トメントは,リストされているパ,ティション(またはサブパ,ティション)内のどの行もwhere_condition
に一致しない場合でも成功したと見なされます。
詳細および例にいては,セクション19.5“パティション選択”を参照してください。
where_condition
は,更新される各行に対して真に評価される式です。式の構文にいては,セクション9.5“式の構文”を参照してください。
table_references
とwhere_condition
は,セクション13.2.9 " select構文"で説明されているように指定されます。
実際に更新された,更新
内で参照されているカラムに対してのみ更新
権限が必要です。読み取られるが,変更されないカラムに対しては,选择
権限のみが必要です。
更新
ステ,トメントは,次の修飾子をサポ,トします。
LOW_PRIORITY
キ,ワ,ドを使用すると,更新
の実行は,ほかのどのクラ。これは,テ,ブルレベルロックのみを使用するストレ,ジエンジン(MyISAM
、内存
,および合并
)にのみ影響を与えます。忽略
キ,ワ,ドを指定すると,更新中にエラ,が発生した場合でも,更新ステ,トメントは中止されません。一意のキ,値に関して重複キ,の競合が発生した行は更新されません。デ,タ変換エラ,の原因になる値に更新された行は,代わりに,もっとも近い有効な値に更新されます。
MySQL 5.6.4以降では,更新忽略
ステトメント(命令
句が存在するものを含む),には,ステートメントベースのレプリケーションには安全でないというフラグが付けられます。(これは,どの行が無視されるかが,行が更新される順序によって決定されるためです)この変更により,このようなステートメントは,ステートメントベースモードを使用しているときはログ内に警告を生成し,混合
モ,ドを使用しているときは行ベ,ス形式を使用してログに記録されます。(Bug #11758262, Bug #50439)詳細は,セクション17.1.2.3 "バナリロギングでの安全および安全でないステトメントの判断"を参照してください。
式で更新されるテ,ブルのカラムにアクセスする場合,更新
はそのカラムの現在の値を使用します。たとえば,次のステ,トメントは,col1
をその現在の値より1大きい値に設定します。
UPDATE t1 SET col1 = col1 + 1;
次のステ,トメントの2番目の割り当ては,col2
を元のcol1
値ではなく,現在の(更新された)col1
値に設定します。この結果,col1
とcol2
の値が同じになります。この動作は標準SQLとは異なります。
UPDATE t1 SET col1 = col1 + 1, col2 = col1;
単一テ,ブルの更新
の割り当ては一般に,左から右に評価されます。複数テ,ブルの更新では,割り当てが特定の順序で実行される保証はありません。
カラムをその現在の値に設定した場合は,MySQLがこれに気付き,その更新を行いません。
非空
として宣言されているカラムを零
に設定することによって更新すると,厳密なSQLモードが有効になっている場合は,エラーが発生します。そうでない場合,カラムはそのカラムデータ型の暗黙のデフォルト値に設定され,警告数が1増やされます。暗黙のデフォルト値は,数値型では0
,文字列型では空の文字列(”
),および日付と時間型では「0」の値です。セクション11.6”デタ型デフォルト値”を参照してください。
更新
は,実際に変更された行数を返します。mysql_info ()
C API関数は,一致して更新された行数と,更新
中に発生した警告の数を返します。
限制
を使用すると,row_count
更新
のスコ,プを制限できます。限制
句は,一致した行の制限です。このステ,トメントは,実際に変更されたかどうかにかかわらず,在哪里
句を満たすrow_count
行を見けるとすぐに停止します。
更新
ステ,トメントに命令
句が含まれている場合は,この句で指定されている順序で行が更新されます。これは,通常であればエラーが発生する可能性のある特定の状況で役立つ場合があります。テーブルt
に,一意の▪▪▪ンデックスを持▪▪▪カラムid
が含まれているとします。次のステ,トメントは,行が更新される順序によっては,重複キ,エラ,で失敗する可能性があります。
UPDATE SET id = id + 1;
たとえば,このテ,ブルのid
カラムに1と2が含まれており,2が3に更新される前に1が2に更新された場合は,エラーが発生します。この問題を回避するには,大きなid
値を持行が小さな値を持行の前に更新されるように,命令
句を追加します。
UPDATE SET id = id + 1
また,複数のテ,ブルを範囲に含む更新
操作を実行することもできます。ただし,複数テ,ブルの更新
では命令
または限制
を使用できません。table_references
句は,結合に含まれるテ,ブルをリストします。その構文にいては,セクション13.2.9.2“加入構文”で説明されています。次に例を示します。
UPDATE items, SET items.price=month。WHERE items.id=month.id;
前の例は,カンマ演算子を使用する内部結合を示していますが,複数テ,ブルの更新
ステ,トメントは,选择
ステトメント内で許可されている任意の型の結合(左连接
など)を使用できます。
外部キ,制約が存在するInnoDB
テ,ブルを含む,複数テ,ブルの更新
ステートメントを使用した場合は,MySQLオプティマイザが,それらの親子関係の順序とは異なる順序でテーブルを処理する可能性があります。この場合,このステ,トメントは失敗し,ロ,ルバックされます。代わりに,1,InnoDB
が提供する在更新
機能を使用して,ほかのテ,ブルがそれに応じて変更されるようにします。セクション14.6.6 " InnoDBとFOREIGN KEY制約"を参照してください。
現在,テ,ブルを更新し,さらにサブクエリ,で同じテ,ブルから選択することはできません。
MySQL 5.6.6より前は,テ,ブルレベルのロックを採用したMyISAM
などのストレ,ジエンジンを使用しているパ,ティション化されたテ,ブルに対する更新
によって,そのテ,ブルのすべてのパ,ティションがロックされました。これは,更新……分区
クエリ,にも当てはまりました。(これは,行レベルロックを採用したInnoDB
などのストレージエンジンでは発生しておらず,現在も発生しません)MySQL 5.6.6以降では,MySQLはパーティションロックプルーニングを使用します。これにより,そのテ,ブルのいずれかのパ,ティション化カラムが更新されないかぎり,更新
ステ,トメントの在哪里
句に一致する行を含むパ,ティションだけが実際にロックされるようになります。詳細は,セクション19.6.4“パティショニングとロック”を参照してください。