無料PHPプログラム

MySQL 5.1 リファレンスマニュアル :: 12 SQL ステートメント構文 :: 12.2 データ取り扱いステートメント :: 12.2.4 INSERT 構文
« 12.2.3 HANDLER 構文

12.2.4.1 INSERT ... SELECT 構文 »
Section Navigation      [Toggle]
  • 12.2 データ取り扱いステートメント
  • 12.2.1 DELETE 構文
  • 12.2.2 DO 構文
  • 12.2.3 HANDLER 構文
  • 12.2.4 INSERT 構文
    • 12.2.4.1 INSERT ... SELECT 構文
    • 12.2.4.2 INSERT DELAYED 構文
    • 12.2.4.3 INSERT ... ON DUPLICATE KEY UPDATE 構文
  • 12.2.5 LOAD DATA INFILE 構文
  • 12.2.6 REPLACE 構文
  • 12.2.7 SELECT 構文
  • 12.2.8 サブクエリ構文
  • 12.2.9 TRUNCATE 構文
  • 12.2.10 UPDATE 構文

12.2.4. INSERT 構文

[+/-]

12.2.4.1. INSERT ... SELECT 構文
12.2.4.2. INSERT DELAYED 構文
12.2.4.3. INSERT ... ON DUPLICATE KEY UPDATE 構文
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
    [INTO] tbl_name [(col_name,...)]
    VALUES ({expr | DEFAULT},...),(...),...
    [ ON DUPLICATE KEY UPDATE col_name=expr, ... ]

または:

INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
    [INTO] tbl_name
    SET col_name={expr | DEFAULT}, ...
    [ ON DUPLICATE KEY UPDATE col_name=expr, ... ]

または:

INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]
    [INTO] tbl_name [(col_name,...)]
    SELECT ...
    [ ON DUPLICATE KEY UPDATE col_name=expr, ... ]

INSERT は既存テーブルに新しい行を挿入します。INSERT ... VALUES と INSERT ... SET 型のステートメントは、明示的に指定された値に基づいて行を挿入します。INSERT ... SELECT 型は別のテーブルから選択された行を挿入します。INSERT ... SELECT については 項12.2.4.1. 「INSERT ... SELECT 構文」 でさらに詳しく説明されています。

古い行に上書きする為に、INSERT の代わりに REPLACE を利用する事ができます。REPLACE は、古い行を複製する固有キー値を含む新しい行の取り扱いの中では INSERT IGNORE と同等になります。新しい行は捨てられるのではなく、古い行を置き換えるのに利用されます。詳しくは 項12.2.6. 「REPLACE 構文」 を参照してください。

tbl_name は行が挿入されるべきテーブルです。ステートメントが値を提供しなければいけないカラムは次のように指定する事ができます。

  • テーブル名の後にカンマで区切られたカラム名のリストを提供する事ができます。この場合、名前が付けられた各カラムの値には VALUES リストか SELECT ステートメントが与えられなければいけません。

  • もし INSERT ... VALUES か INSERT ... SELECT にカラム名のリストを指定しなければ、VALUES リストか SELECT ステートメントがテーブル内全てのカラムの値を提供する必要があります。もしテーブル内のカラムの順番がわからなければ、それを見つける為に DESCRIBE tbl_name を利用してください。

  • SET 条項はカラム名を明示的に指示します。

カラム値を与える方法はいくつかあります。

  • もしストリクト SQL モードを利用していない場合、値を明示的に与えられていないカラムはそのデフォルト値(明示的、または暗黙の)に設定されます。例えば、もしテーブル内の全てのカラムに名前を付けないカラムのリストを指定すると、名づけられていないカラムはそのデフォルト値に設定されます。デフォルト値の割り当てについては 項10.1.4. 「データタイプデフォルト値」 で説明しています。項1.8.6.2. 「無効値の制約」 もご参照ください。

    もし、デフォルト値を持たない全てのカラムの値を明示的に指定しない限りエラーを発生させる INSERT ステートメントが必要であれば、ストリクト モードを利用する必要があります。詳しくは 項4.2.6. 「SQL モード」 を参照してください。

  • 明示的にカラムをそのデフォルト値に設定するには、キーワード DEFAULT を利用してください。これはテーブル内の各カラムの値を持たない不完全な VALUES リストの書き込みを防ぐ事ができるので、一部を除く全てのカラムに値を割り当てる INSERT ステートメントの書き込みを簡単にします。そうでなければ、VALUES リスト内のそれぞれの値に対応するカラム名のリストを書かなければいけません。

    また、与えられたカラムのデフォルト値を生成する式の中で利用されるより一般的な形として、DEFAULT(col_name) を利用する事もできます。

  • もしカラム リストと VALUES リストの両方が空なら、INSERT は各カラム セットを利用してそのデフォルト値に行を作成します。

    INSERT INTO tbl_name () VALUES();
    

    ストリクト モードでは、もしどのカラムもデフォルト値を持っていなければエラーが発生します。そうでなければ、MySQL は明示的に指定されたデフォルト値を持たない全てのカラムに対して暗黙のデフォルト値を利用します。

  • カラム値を提供する為に expr 式を指定する事ができます。もし式のタイプがカラムのタイプに合わなければ、タイプの変換が行われる可能性があり、そしてデータのタイプによっては、与えられた値の変換が別の挿入値を生み出す事があります。例えば、文字列 '1999.0e-2' を、INT、FLOAT、DECIMAL(10,6)、または YEAR カラムに挿入すると、それぞれ 1999、19.9921、19.992100、そして 1999 が挿入される事になります。INT と YEAR カラムに格納された値が 1999 である理由は、文字列から整数への変換時には、文字列の最初の部分の、有効な整数や年として判断される部分だけを見るからです。浮動小数点と固定小数点カラムに対しては、文字列から浮動小数点への変換時には、文字列全体を有効な浮動小数点として判断します。

    expr 式は、値のリストに早いうちに設定された全てのカラムを参照する事ができます。例えば、col2 の値は、既に割り当てられた col1 を参照する事ができるので、上記のような事が可能なのです。

    INSERT INTO tbl_name (col1,col2) VALUES(15,col1*2);
    

    しかし、col1 の値は、col1 の後で割り当てられた col2 を参照する為、次のような物は正当ではありません。

    INSERT INTO tbl_name (col1,col2) VALUES(col2*2,15);
    

    1つの例外が AUTO_INCREMENT 値を持つカラムに関係しています。別の値の割り当て後に AUTO_INCREMENT 値が発生するので、その割り当ての中での AUTO_INCREMENT カラムへの参照は 0 を返すのです。

VALUES 構文を利用する INSERT ステートメントは複数行を挿入する事ができます。これをする為には、それぞれが括弧で囲まれカンマで区切られている、カラム値の複数リストを含んでください。例:

INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);

各行の値のリストは括弧で囲まれている必要があります。次のステートメントは、カラム名の数とリストの中の値の数が合わない為、不正となります。

INSERT INTO tbl_name (a,b,c) VALUES(1,2,3,4,5,6,7,8,9);

INSERT の行に影響された値は mysql_affected_rows() C API 関数を利用して取得できます。詳しくは 項23.2.3.1. 「mysql_affected_rows()」 を参照してください。

もし INSERT ... VALUES ステートメントを複数値リストか INSERT ... SELECT と共に利用すると、そのステートメントはこのフォーマットで文字列情報を戻します。

Records: 100 Duplicates: 0 Warnings: 0

Records はステートメントによって生成された行数を指示します。(Duplicates がゼロ以外の数値になりえる為、実際に挿入された行数でなければいけないという訳ではありません。)既存の固有インデックス値を複製するので、Duplicates は挿入できなかった行数を指示します。Warnings は、何らかの形で問題があった、カラム値挿入の試みの回数を指示します。警告は次のような条件時に発生します。

  • NOT NULL を宣言していたカラムに NULL を挿入する。複合行 INSERT ステートメントや INSERT INTO ... SELECT ステートメントに対しては、カラムはカラム データ タイプの暗黙のデフォルト値に設定されます。数値タイプ、文字列タイプの空の文字列('')、そして日付、時間タイプの 「ゼロ」 値に対してのこの値は 0 です。サーバは単列を戻すかどうかを確認する為に SELECT からの結果セットを検査しない為、INSERT INTO ... SELECT ステートメントは複合行挿入と同じ方法で扱われます。(単列 INSERT に対しては、NULL が NOT NULL カラムに挿入された時、警告は発生しません。代わりに、ステートメントはエラーになり失敗します。)

  • 数値カラムを、範囲外の値に設定する。値はその範囲の終点に一番近いところでクリップされます。

  • 数値カラムに '10.34 a' のような値を割り当てる。後続の非数値テキストは取り除かれ、残りの数値部分が挿入されます。もし文字列値がその最初の部分に数値を持たない場合は、そのカラムは 0 に設定されます。

  • 文字列を、カラムの最大長さを上回る文字列カラムに (CHAR、VARCHAR、TEXT、または BLOB)挿入する。値はカラムの最大長さまで切り捨てられます。

  • 日付や時間カラムに不正である値を挿入する。カラムはそのタイプにとって適正であるゼロの値に設定されます。

もしC API を利用していれば、mysql_info() 関数を呼び出す事で、情報文字列を得ることができます。詳しくは 項23.2.3.35. 「mysql_info()」 を参照してください。

もし AUTO_INCREMENT カラムを持つテーブルに INSERT が行を挿入すれば、SQL LAST_INSERT_ID() 関数を利用する事でそのカラムに利用される値を見つける事ができます。C API の内部から、mysql_insert_id() 関数を利用してください。しかし、2つの関数がいつでも全く同じ働きをする訳ではない事に注意してください。AUTO_INCREMENT カラムに関しての、INSERT ステートメントの動作の更なる情報は 項11.10.3. 「情報関数」 と 項23.2.3.37. 「mysql_insert_id()」 で紹介されています。

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

  • もし DELAYED キーワードを利用すると、サーバはバッファに挿入される行を置くので、INSERT DELAYED ステートメントを発行するクライアントは即座に再開されます。もしテーブルが使用中であれば、サーバが行を保持します。テーブルがフリーであればサーバは行の挿入を始め、新しいリクエストがないかを調べる為に定期的にテーブルを確認します。もしあれば、遅れた行の列はテーブルが再度フリーになるまでサスペンドされます。項12.2.4.2. 「INSERT DELAYED 構文」 を参照してください。

    サーバは、INSERT ... SELECT か

    INSERT ... ON DUPLICATE KEY UPDATE に対して

    DELAYED を無視します。

  • もし LOW_PRIORITY キーワードを利用すると、別のクライアントがテーブルからの読み込みをしなくなるまで、INSERT の実行が遅れます。これには、既存クライアントが読み込みをしている最中、そして INSERT LOW_PRIORITY ステートメントが待っている最中に読み込みを始めてしまう別のクライアントが含まれます。しかし、INSERT LOW_PRIORITY ステートメントを発行するクライアントがリード ヘビー環境の中で長時間(または永遠に)待つ事は可能です。(これは、クライアントにそのまま作業を続けさせる INSERT DELAYED とは逆の機能です。並列挿入ができなくなるので、通常 LOW_PRIORITY は MyISAM テーブルと一緒には利用されません。詳しくは 項6.3.3. 「同時挿入」 を参照してください。

  • もし HIGH_PRIORITY を指定すると、サーバが --low-priority-updates オプションでスタートされている場合その効果が無効になります。また、並行挿入も利用されなくなります。

  • もし IGNORE キーワードを利用したら、INSERT ステートメントの実行中に起きたエラーは警告として扱われます。例えば、IGNORE が無いと、テーブル内に既存の UNIQUE インデックスや PRIMARY KEY 値を複製する行に複製キー エラーが起き、そのステートメントは異常終了されます。IGNORE を利用すると、行の挿入はされませんが、エラーも発行されません。もし IGNORE が指定されなければ、データ変換はステートメントに関するエラーを引き起こします。IGNORE を利用すると、不正な値は一番近い値に調節されて挿入され、警告が発生されますがステートメントは異常終了しません。いくつのテーブルが実際に挿入されたのか、mysql_info() C API 関数を利用して調べる事ができます。

  • もし ON DUPLICATE KEY UPDATE を指定し、UNIQUE インデックスか PRIMARY KEY 内で複製値を引き起こす行が挿入されると、古い行の UPDATE が実行されます。詳しくは 項12.2.4.3. 「INSERT ... ON DUPLICATE KEY UPDATE 構文」 を参照してください。

Copyright c 1997, 2010, Oracle and/or its affiliates. All rights reserved. Legal Notices
Top / Previous / Next / Up / Table of Contents
© 2010, Oracle Corporation and/or its affiliates

無料CGI PHPスクリプト | 新着情報スクリプト | 営業日カレンダー | PHPマニュアル | MySQLマニュアル | PEARマニュアル

Copyright (c) 2010 jmcodex.com All rights reserved.