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 つの名前が何であっても同じです。
クエリが返すすべての行が、対象テーブルの行になります。
例
- 集計を保存する
rating_count は空で、sakila.film が答えを持っています。テーブルを
database.table と書くと別のデータベースから読めるので、1 つの文で 2 つの
データベースをまたげます。
GROUP BY が 5 行を生成し、5 行が書き込まれました。
film が変わっても、
何もこれらを更新しません。
- 挿入の途中で値を組み立てる
SELECT は何でも計算できるので、挿入する行がその形でどこかに存在している
必要はありません。
CONCAT で作られ、日付はすべての行で繰り返される定数です。
ERROR 1136 は 2 つのリストの長さが違うという意味
SELECT は受け入れられ、意味のないデータを書き
込みます。まず SELECT を単独で実行し、何が返るかを読んでください。
2 回目の実行はテーブルのキーにぶつかる
クエリが返すすべての行がテーブルに差し出され、テーブルのルールは依然として 適用されます。rating は主キーであり、G は既に保存されています。一度作るだけでなく
更新したい集計には upsert が必要です。upsert は失敗する
代わりに保存済みの行を更新します。
まとめ
VALUESを置く場所にSELECTを置き、VALUESキーワードは書きません。- 列は位置で対応し、名前では決して対応しません。
ERROR 1136は、2 つのリストの長さが違うという意味です。- 同じ文の中で別のデータベースから読むには、テーブルを
database.tableと書きます。 - 2 回目の実行は、他の挿入と同じように対象テーブルのキーにぶつかります。
関連項目
- INSERT — 入力した値を受け取る形式
- 複数行の挿入 — クエリを使わずに多数の行を挿入する
- Upsert — 2 回目の実行で衝突する行を更新する
- MySQL の一括挿入 — 大量のデータを移動する方法とそのコスト