メインコンテンツへスキップ

VillageSQL is a drop-in replacement for MySQL with extensions.

All examples on this page work on VillageSQL. Install Now →
VALUES は入力した行を与えます。その場所に置いた SELECT はサーバーが 求めた行を与えるので、クエリで得られる集計は保存できる集計になります。 レポート用のテーブルはこうして埋められ、行はこうしてテーブル間を移動します。 これらの例では、INSERT の sakila_practice データベースを 使います。始める前にそこにあるセットアップブロックをもう一度実行し、次に mysql -u root -p sakila_practice でクライアントを開いてください。

INSERT SELECT の仕組み

TARGET_TABLE を書き込み先のテーブルに、COLUMN_LIST をその列に、 SOURCE_COLUMNS をクエリが返すものに、SOURCE_TABLE を読み取り元の テーブルに置き換えます。 VALUES キーワードはありません。列は位置で対応するので、SELECT が最初に 返すものは最初に指定した列に入ります。2 つの名前が何であっても同じです。 クエリが返すすべての行が、対象テーブルの行になります。

例

  1. 集計を保存する

rating_count は空で、sakila.film が答えを持っています。テーブルを database.table と書くと別のデータベースから読めるので、1 つの文で 2 つの データベースをまたげます。
GROUP BY が 5 行を生成し、5 行が書き込まれました。
これらは今や普通の行であり、スナップショットです。film が変わっても、 何もこれらを更新しません。

  1. 挿入の途中で値を組み立てる

SELECT は何でも計算できるので、挿入する行がその形でどこかに存在している 必要はありません。
アドレスの列は CONCAT で作られ、日付はすべての行で繰り返される定数です。

ERROR 1136 は 2 つのリストの長さが違うという意味

2 列を指定し、1 列が返されました。このエラーが出るとき、2 つのリストの 長さは必ず異なるので、数えてください。名前や意味は何も確認されないので、 正しい数の誤った列を返す SELECT は受け入れられ、意味のないデータを書き 込みます。まず SELECT を単独で実行し、何が返るかを読んでください。

2 回目の実行はテーブルのキーにぶつかる

クエリが返すすべての行がテーブルに差し出され、テーブルのルールは依然として 適用されます。
rating は主キーであり、G は既に保存されています。一度作るだけでなく 更新したい集計には upsert が必要です。upsert は失敗する 代わりに保存済みの行を更新します。

まとめ

  • VALUES を置く場所に SELECT を置き、VALUES キーワードは書きません。
  • 列は位置で対応し、名前では決して対応しません。
  • ERROR 1136 は、2 つのリストの長さが違うという意味です。
  • 同じ文の中で別のデータベースから読むには、テーブルを database.table と書きます。
  • 2 回目の実行は、他の挿入と同じように対象テーブルのキーにぶつかります。

関連項目

  • INSERT — 入力した値を受け取る形式
  • 複数行の挿入 — クエリを使わずに多数の行を挿入する
  • Upsert — 2 回目の実行で衝突する行を更新する
  • MySQL の一括挿入 — 大量のデータを移動する方法とそのコスト