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

12.2.4.2 INSERT DELAYED 構文 »
Section Navigation      [Toggle]
  • 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.4.1. INSERT ... SELECT 構文

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

INSERT ... SELECT を利用すると、1つ、または複数のテーブルから多くの行をすばやく挿入する事ができます。例:

INSERT INTO tbl_temp2 (fld_id)
  SELECT tbl_temp1.fld_order_id
  FROM tbl_temp1 WHERE tbl_temp1.fld_order_id > 100;

次の条件は INSERT ... SELECT ステートメントを保持します。

  • 複製キー違反を引き起こす行を無視する為に IGNORE を指定してください。

  • DELAYED は INSERT ... SELECT と共に無視されます。

  • INSERT ステートメントの対象テーブルはクエリの SELECT 部のFROM 条項内に現れます。(これは MySQL の古いバージョンでは不可能でした。)この場合、MySQL は行を保持する為に SELECT からテンポラリ テーブルを作成し、そして対象テーブルにそれらの行を挿入します。

  • AUTO_INCREMENT カラムは通常通り機能します。

  • バイナリ ログが元テーブルを再作成する為に利用できる事を保障する為に、MySQL は INSERT ... SELECT ステートメントへの並列挿入を許可しません。

  • 現在は、サブクエリの中で1つのテーブルに挿入し、同じテーブルから選択する事はできません。

  • SELECT と INSERT が同じテーブルを参照した時に、曖昧なカラム参照の問題を防ぐ為に、SELECT 部分で利用される各テーブルに固有のエイリアスを与え、その部分の中でのカラム名を適切なエイリアスに限定してください。

ON DUPLICATE KEY UPDATE の値部分の中で、SELECT 部分の中で GROUP BY を利用しない限り、別のテーブル内でカラムの参照をする事ができます。値の部分で非固有カラム名を指定しなければいけない、という副作用が1つあります。

Copyright © 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