10bet网址
MySQL 5.6リファレンスマニュアル
下载本手册

13.2.11 update構文

単一テ,ブル構文:

更新[low_priority] [ignore]table_referencecol_name1= {expr1|默认}(,col_name2= {expr2|默认}]…(在哪里where_condition[按…订购]][限制row_count

複数テ,ブル構文:

更新[low_priority] [ignore]table_referencescol_name1= {expr1|默认}(,col_name2= {expr2|默认}]…(在哪里where_condition

単一テ,ブル構文の場合,更新ステ,トメントは,指定されたテ,ブル内の既存の行のカラムを新しい値に更新します。句は,変更するカラムと,それらのカラムに指定される値を示します。各値は式か,またはカラムを明示的にそのデフォルト値に設定するキ,ワ,ド默认的として指定できます。在哪里句(指定されている場合)は,どの行を更新するかを識別する条件を指定します。在哪里句がない場合は,すべての行が更新されます。命令句が指定されている場合は,指定されている順序で行が更新されます。限制句は,更新できる行数に制限を設定します。

複数テ,ブル構文の場合,更新は,条件を満たすtable_referencesで指定されている各テ,ブル内の行を更新します。一致した各行は,条件に複数回一致した場合でも,1回更新されます。複数テ,ブル構文の場合は,命令および限制を使用できません。

パーティション化されたテーブルの場合は,このステートメントの単一テーブルと複数テーブルの両方の形式で,テーブル参照の一部としての分区オプションの使用がサポ,トされます。このオプションは1つ以上のパーティションまたはサブパーティション(またはその両方)のリストを受け取ります。リストされているパーティション(またはサブパーティション)だけが一致をチェックされ,これらのパーティションまたはサブパーティションのいずれにも存在しない行は,where_conditionを満たすかどうかにかかわらず更新されません。

注記

插入または取代ステ,トメントで分区を使用している場合とは異なり,それ以外は有効な更新……分区ステ,トメントは,リストされているパ,ティション(またはサブパ,ティション)内のどの行もwhere_conditionに一致しない場合でも成功したと見なされます。

詳細および例にいては,セクション19.5“パティション選択”を参照してください。

where_conditionは,更新される各行に対して真に評価される式です。式の構文にいては,セクション9.5“式の構文”を参照してください。

table_referenceswhere_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値に設定します。この結果,col1col2の値が同じになります。この動作は標準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“パティショニングとロック”を参照してください。