插入[low_priority | delayed | high_priority] [ignore] [into]tbl_name(分区(partition_name,……))((col_name{值|值}({expr|违约 },...),(...),...重复密钥更新col_name=expr(,col_name=expr)……]
または:
插入[low_priority | delayed | high_priority] [ignore] [into]tbl_name(分区(partition_name,……)col_name= {expr|默认},…重复密钥更新col_name=expr(,col_name=expr)……]
または:
插入[low_priority | high_priority] [ignore] [into]tbl_name(分区(partition_name,……))((col_name,…)选择……重复密钥更新col_name=expr(,col_name=expr)……]
插入
は,既存のテブルに新しい行を挿入します。このステトメントの插入……值
および插入……集
形式は,明示的に指定された値に基づいて行を挿入します。插入……选择
形式は,別の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)
,または一年
カラムに挿入すると,それぞれ,値1999
、19.9921
、19.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_PRIORITY
とHIGH_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_name
=expr
割り当ての右側でのみ参照されるカラムの場合など)。
MySQL 5.6.6より前は,テブルレベルのロックを採用したMyISAM
などのストレジエンジンを使用しているパティション化されたテブルに影響を与える插入
によって,そのテブルのすべてのパティションがロックされました。これは,插入……分区
ステトメントにも当てはまりました。(これは,行レベルロックを採用したInnoDB
などのストレージエンジンでは発生しておらず,現在も発生しません)MySQL 5.6.6以降では,MySQLはパーティションロックプルーニングを使用します。これにより,行が挿入されるパティションだけが実際にロックされるようになります。詳細は,セクション19.6.4 "パティショニングとロック"を参照してください。