PostgreSQL: SELECTクエリ結果をまるごと挿入する魔法の構文 INSERT INTO ... (SELECT * ...)
PostgreSQL: INSERT INTO ... (SELECT * ...) の詳細解説
INSERT INTO ... (SELECT * ...)
は、PostgreSQL における強力なデータ挿入構文です。この構文は、SELECT クエリによって取得された結果をまるごと別のテーブルに挿入するために使用されます。
構文
INSERT INTO 対象テーブル名 (列名1, 列名2, ...)
SELECT 列名1, 列名2, ...
FROM データソース;
解説
INSERT INTO
: データを挿入するテーブルを指定します。対象テーブル名
: データを挿入するテーブルの名前を記述します。(列名1, 列名2, ...)
: 挿入する列を指定します。省略可能です。SELECT
: 挿入するデータを取得するSELECTクエリを記述します。列名1, 列名2, ...
: SELECTクエリで取得する列を指定します。FROM
: データを取得するテーブルまたはサブクエリを記述します。
例
-- テーブル`users`から`name`と`email`列をすべて`customers`テーブルに挿入
INSERT INTO customers (name, email)
SELECT name, email
FROM users;
-- SELECTクエリ結果に基づいて`orders`テーブルにデータ挿入
INSERT INTO orders (product_id, quantity)
SELECT product_id, quantity
FROM cart
WHERE user_id = 123;
ポイント
*
を使用すると、SELECTクエリで取得されたすべての列を挿入できます。- INSERT する列とSELECT する列は、名前と順序が一致する必要があります。
- WHERE 句などの条件を SELECT クエリに追加することで、挿入するデータの絞り込みができます。
- INSERT INTO ... (SELECT ...) は、大量のデータを効率的に挿入するのに役立ちます。
補足
- より高度なデータ挿入には、
ON CONFLICT
句などを活用できます。
関連キーワード
- SQL
- PostgreSQL
- INSERT
- SELECT
- ON CONFLICT
テーブル作成
-- サンプルテーブル作成
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL
);
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
user_id INTEGER NOT NULL,
product_id INTEGER NOT NULL,
quantity INTEGER NOT NULL
);
データ挿入
-- usersテーブルにデータ挿入
INSERT INTO users (name, email)
VALUES ('John Doe', '[email protected]'),
('Jane Doe', '[email protected]');
-- ordersテーブルにデータ挿入
INSERT INTO orders (user_id, product_id, quantity)
VALUES (1, 100, 1),
(1, 200, 2),
(2, 100, 3);
SELECTクエリによるデータ挿入
-- usersテーブルからnameとemail列をすべてcustomersテーブルに挿入
INSERT INTO customers (name, email)
SELECT name, email
FROM users;
-- SELECTクエリ結果に基づいてordersテーブルにデータ挿入
INSERT INTO orders (product_id, quantity)
SELECT product_id, quantity
FROM cart
WHERE user_id = 123;
補足
PostgreSQL: INSERT INTO の他の方法
VALUES 句による挿入
INSERT INTO users (name, email)
VALUES ('John Doe', '[email protected]'),
('Jane Doe', '[email protected]');
RETURNING 句
INSERT INTO users (name, email)
VALUES ('John Doe', '[email protected]')
RETURNING id;
COPY コマンド
COPY users (name, email)
FROM '/path/to/file.csv'
DELIMITER ','
CSV HEADER;
INSERT ... ON CONFLICT
INSERT INTO orders (user_id, product_id, quantity)
VALUES (1, 100, 1)
ON CONFLICT (user_id, product_id) DO UPDATE
SET quantity = quantity + 1;
PL/pgSQL を使用した挿入
DO $$
BEGIN
FOR i IN 1..10 LOOP
INSERT INTO users (name, email)
VALUES (CONCAT('user', i), CONCAT('user', i, '@example.com'));
END LOOP;
END;
$$;
これらの方法はそれぞれ異なる利点と欠点があります。状況に応じて最適な方法を選択する必要があります。
- VALUES
- COPY
- PL/pgSQL
sql postgresql insert