10bet网址
MySQL 5.6リファレンスマニュアル
本手册下载
PDF (Ltr)- 26.8 mb
PDF (A4)- 26.8 mb
HTML下载(TGZ)- 7.2 mb
HTML下载(邮政编码)- 7.2 mb


13.2.5 insert構文

插入[low_priority | delayed | high_priority] [ignore] [into]tbl_name(分区(partition_name,……))((col_name{值|值}({expr|违约 },...),(...),...重复密钥更新col_nameexpr(,col_nameexpr)……]

または:

插入[low_priority | delayed | high_priority] [ignore] [into]tbl_name(分区(partition_name,……)col_name= {expr|默认},…重复密钥更新col_nameexpr(,col_nameexpr)……]

または:

插入[low_priority | high_priority] [ignore] [into]tbl_name(分区(partition_name,……))((col_name,…)选择……重复密钥更新col_nameexpr(,col_nameexpr)……]

插入は,既存のテブルに新しい行を挿入します。このステトメントの插入……值および插入……集形式は,明示的に指定された値に基づいて行を挿入します。插入……选择形式は,別の1または複数のテブルから選択された行を挿入します。插入……选择にいては,セクション13.2.5.1 " insert…选择構文"でさらに詳細に説明されています。

MySQL 5.6.2以降では,パーティション化されたテーブルに挿入する場合,どのパーティションおよびサブパーティションが新しい行を受け入れるかを制御できます。分区オプションは,テーブルの1つ以上のパーティションまたはサブパーティション(またはその両方)の名前のカンマ区切りリストを受け取ります。特定の插入ステトメントによって挿入される行がリストされているいずれかのパティションに一致しない場合,插入ステトメントは发现与给定分区集不匹配的行エラで失敗します。詳細および例にいては,セクション19.5 "パティション選択"を参照してください。

古い行を上書きするには,插入の代わりに取代を使用できます。取代は,古い行を複製する一意のキ値を含む新しい行の処理において插入忽略に相当するものです。新しい行は,破棄されるのではなく,古い行を置き換えるために使用されます。セクション13.2.8 " replace構文"を参照してください。

tbl_nameは,行が挿入されるテブルです。このステトメントによって値が提供されるカラムは,次のように指定できます。

  • テブル名のあとにカラム名のカンマ区切りリストを指定できます。この場合は,指定された各カラムの値をリストまたは选择ステトメントで指定する必要があります。

  • 插入……值または插入……选择にカラム名のリストを指定しない場合は,テブル内のすべてのカラムの値をリストまたは选择ステトメントで指定する必要があります。テブル内のカラムの順序がわからない場合は,描述tbl_nameを使用して見けます。

  • 句は,カラム名を明示的に示します。

カラム値は,次のいくかの方法で指定できます。

  • 厳密なSQLモードで実行していない場合,値が明示的に指定されていないカラムはすべて,デフォルトの(明示的または暗黙的な)値に設定されます。たとえば,テーブル内のすべてのカラムを指定していないカラムリストを指定した場合,指定されていないカラムはそのデフォルト値に設定されます。デフォルト値の割り当てにいては,セクション11.6 "デタ型デフォルト値"で説明されています。セクション1.7.3.3 "無効デタの制約"も参照してください。

    デフォルト値が含まれていないすべてのカラムの値を明示的に指定しないかぎり,插入ステトメントでエラが生成されるようにする場合は,厳密モドを使用するようにしてください。セクション5.1.7 "サバSQLモド"を参照してください。

  • カラムを明示的にそのデフォルト値に設定するには,キワド默认的を使用します。これにより,テブル内の各カラムの値が含まれていない不完全なリストを書かなくても済むため,いくかのカラムを除くすべてのカラムに値を割り当てる插入ステトメントの記述が容易になります。そうでない場合は,リスト内の各値に対応するカラム名のリストを書き出す必要があります。

    また,特定のカラムのデフォルト値を生成する式で使用できるより一般的な形式として违约(col_nameを使用することもできます。

  • カラムリストとリストの両方が空である場合,插入は,各カラムがそのデフォルト値に設定された行を作成します。

    插入tbl_name()()值;

    厳密モドでは,いずれかのカラムにデフォルト値が含まれていない場合,エラが発生します。それ以外の場合,MySQLは,明示的に定義されたデフォルト値が含まれていないすべてのカラムに対して暗黙のデフォルト値を使用します。

  • exprを指定して,カラム値を指定できます。これには,式の型がカラムの型に一致しない場合は型変換が行われる可能性があり,特定の値の変換によって,データ型に応じて異なる値が挿入されることがあります。たとえば,文字列“依照1999.0”INT浮动小数(10,6),または一年カラムに挿入すると,それぞれ,値199919.992119.992100,および1999が挿入されます。INTおよび一年カラムに格納される値が1999である理由は,文字列から整数への変換では,その文字列の最初の,有効な整数または年と見なすことができる部分だけが調べられるためです。浮動小数点および固定小数点数カラムの場合,文字列から浮動小数点への変換では,文字列全体を有効な浮動小数点値と見なします。

    exprは,以前に値リスト内に設定された任意のカラムを参照できます。たとえば,次のステ,トメントは,col2の値が,前に割り当てられているcol1を参照しているため実行可能です。

    插入tbl_name(col2 col1值(15日col1 * 2);

    ただし,次のステ,トメントは,col1の値が,col1のあとに割り当てられているcol2を参照しているため正当ではありません。

    插入tbl_name(col2 col1值(col2 * 2、15);

    1の例外として,AUTO_INCREMENT値を含むカラムがあります。AUTO_INCREMENT値はほかの値の割り当てのあとに生成されるため,割り当て内のAUTO_INCREMENTカラムへの参照はすべて0を返します。

構文を使用する插入ステトメントは複数の行を挿入できます。これを行うには,それぞれが括弧で囲まれ,カンマで区切られた,カラム値の複数のリストを含めます。例:

插入tbl_name(a, b, c)值(1、2、3),(4、5、6),(7 8 9);

各行の値リストは,括弧で囲まれている必要があります。次のステトメントは,リスト内の値の数がカラム名の数に一致しないため不正です。

插入tbl_name(a, b, c)值(1,2,3,4,5,6,7,8,9);

このコンテキストでは,价值のシノニムです。どちらも,値リストの数については何も示しておらず,値リストが1つの場合でも複数の場合でも使用できます。

插入に関して影響を受けた行の値は,ROW_COUNT ()関数 (セクション12.14 "情報関数"を参照してください)またはmysql_affected_rows ()C API関数(セクション23.7.7.1 " mysql_affected_rows() "を参照してください)を使用して取得できます。

插入……值ステトメントを複数の値リストまたは插入……选择とともに使用した場合,このステ,トメントは,次の形式の情報文字列を返します。

记录:100重复:0警告:0

记录は,このステトメントによって処理された行数を示します。(これは,重复的が0以外であることがあるため,必ずしも実際に挿入された行数ではありません。)重复的は、何らかの既存の一意の以及ンデックス値を複製しているために挿入できなかった行数を示します。警告は,何らかの点で問題があったカラム値を挿入するための試行回数を示します。警告は,次のいずれかの条件で発生する場合があります。

  • 非空として宣言されているカラムへのの挿入。複数行の插入ステトメントまたは插入……选择ステトメントの場合,このカラムは,そのカラムデタ型の暗黙のデフォルト値に設定されます。これは,数値型では0,文字列型では空の文字列(''),および日付と時間型では0の値です。サバは选择からの結果セットを検査して,それが単一行を返すかどうかを確認しないため,插入……选择ステトメントは複数行の挿入と同じ方法で処理されます。(単一行の插入の場合は,非空カラムに挿入されても警告は発生しません.代わりに,このステ.トメントがエラ.で失敗します.)

  • 数値カラムの,そのカラムの範囲外にある値への設定。この値は,その範囲のもっとも近い端点にクリップされます。

  • 数値カラムへの“10.34”などの値の割り当て。後続の非数値のテキストは取り除かれ,残りの数値部分が挿入されます。文字列値に先頭の数値部分が含まれていない場合,このカラムは0に設定されます。

  • 文字列カラム(字符VARCHAR文本,または)への,そのカラムの最大長を超える文字列の挿入。この値は,そのカラムの最大長に切り捨てられます。

  • 日付または時間カラムへの,そのデタ型として不正な値の挿入。このカラムは,その型の適切な0の値に設定されます。

C APIを使用している場合は,mysql_info ()関数を呼び出すことによって情報文字列を取得できます。セクション23.7.7.35 " mysql_info() "を参照してください。

插入AUTO_INCREMENTカラムを含むテブルに行を挿入した場合,そのカラムに使用された値はSQLのLAST_INSERT_ID ()関数を使用して検索できます。C API内からは,mysql_insert_id ()関数を使用します。

注記

これらの2の関数が,必ずしも同じ動作を行うとは限りません。AUTO_INCREMENTカラムに関連した插入ステトメントの動作にいては,セクション12.14 "情報関数"およびセクション23.7.7.37 " mysql_insert_id() "でさらに詳細に説明されています。

插入ステトメントは,次の修飾子をサポトします。

  • 延迟キワドを使用した場合は,挿入される1または複数の行をサに配置するため,插入延迟ステトメントを発行しているクラに続行できます。そのテブルが使用中である場合,サはそれらの行を保持します。そのテーブルが未使用である場合,サーバーは行の挿入を開始する一方,そのテーブルに対する新しい読み取り要求が存在するかどうかを定期的にチェックします。存在する場合は,そのテ,ブルがふたたび未使用になるまで,遅延された行のキュ,は中断されます。セクション13.2.5.2 " insert delayed構文"を参照してください。

    延迟は,插入……选择または插入……关于重复密钥更新では無視されます。

    延迟はまた,テブルやトリガにアクセスする関数を使用しているか,または関数やトリガから呼び出された插入でも無視されます。

    注記

    MySQL 5.6.6現在,插入延迟は非推奨であり,将来のリリスで削除されます。代わりに插入延迟を付けない)を使用してください。

  • LOW_PRIORITYキワドを使用した場合,插入の実行は、ほかのどのクラ。これには,既存のクラ插入LOW_PRIORITYステトメントが待機している間に読み取りを開始したほかのクラ。そのため,読み取り負荷の高い環境では,插入LOW_PRIORITYステートメントを発行したクライアントが非常に長い時間(場合によっては無期限に)待機することになるおそれがあります。(これは,クラeアントをただに続行できるようにする插入延迟とは対照的です。)MyISAMテブルでLOW_PRIORITYを使用すると,並列挿入が無効になるため,通常はこれを行わないようにしてください。セクション8.10.3 "同時挿入"を参照してください。

    HIGH_PRIORITYを指定すると,サバが——low-priority-updatesオプションで起動されている場合に,その効果がオ。また,同時挿入も使用されなくなります。セクション8.10.3 "同時挿入"を参照してください。

    LOW_PRIORITYHIGH_PRIORITYは,テブルレベルのロックのみを使用するストレジエンジン(MyISAM内存合并など)にのみ影響を与えます。

  • 忽略キワドを使用した場合,插入ステトメントの実行中に発生したエラは無視されます。たとえば,忽略を使用しない場合は,テブル内の既存の独特的ンデックスまたは主键値を複製する行によって重複キエラが発生し,このステトメントは中止されます。忽略を指定すると,その行が破棄され,エラ,は発生しません。代わりに、無視されたエラーが警告を生成する可能性がありますが、重複キーエラーは生成しません。

    忽略には,特定の値に一致するパーティションが見つからないパーティション化されたテーブルへの挿入でも同様の効果があります。忽略を指定しない場合,このような插入ステトメントはエラで中止されます。ただし,插入忽略が使用されている場合は,一致しない値を含む行に対する挿入操作が暗黙のうちに失敗しますが,一致した行はすべて挿入されます。例にいては,セクション19.2.2 " listパティショニング"を参照してください。

    忽略が指定されていない場合は,エラをトリガするデタ変換によってステトメントが中止されます。忽略を指定すると,無効な値はもっとも近い値に調整されて挿入されます。警告は生成されますが,ステトメントは中止されません。mysql_info ()C API関数を使用すると,テ,ブルに実際に挿入された行数を確認できます。

  • 关于重复密钥更新を指定したとき,独特的ンデックスまたは主键に重複した値を発生させる行が挿入された場合は,古い行の更新が実行されます。行ごとの影響を受けた行の値は,その行が新しい行として挿入された場合は1,既存の行が更新された場合は2,既存の行がその現在の値に設定された場合は0です。mysqldへの接続時にCLIENT_FOUND_ROWSフラグをmysql_real_connect ()に指定すると,既存の行がその現在の値に設定された場合の影響を受けた行の値は(0ではなく)1になります。セクション13.2.5.3 " insert…"重复密钥更新構文"を参照してください。

テブルに挿入するには,そのテブルに対する插入権限が必要です。关于重复密钥更新句が使用されていて,重複キのために代わりに更新が実行される場合,このステ,トメントには,更新されるカラムに対する更新権限が必要です。読み取られるが,変更されないカラムの場合は,选择権限のみが必要です(关于重复密钥更新句にあるcol_nameexpr割り当ての右側でのみ参照されるカラムの場合など)。

MySQL 5.6.6より前は,テブルレベルのロックを採用したMyISAMなどのストレジエンジンを使用しているパティション化されたテブルに影響を与える插入によって,そのテブルのすべてのパティションがロックされました。これは,插入……分区ステトメントにも当てはまりました。(これは,行レベルロックを採用したInnoDBなどのストレージエンジンでは発生しておらず,現在も発生しません)MySQL 5.6.6以降では,MySQLはパーティションロックプルーニングを使用します。これにより,行が挿入されるパティションだけが実際にロックされるようになります。詳細は,セクション19.6.4 "パティショニングとロック"を参照してください。