PostgreSQL: SELECT INTOコマンドで新しいテーブルを作成
PostgreSQL: 別のテーブルからINSERTする方法
方法
- INSERT INTO コマンドを使用します。
- 挿入先のテーブル名を指定します。
- VALUES キーワードを使用して、挿入する値を指定します。
- 別のテーブルからSELECTクエリを使ってデータを取得します。
例
-- テーブル `users` から `name` と `email` を `customers` テーブルに挿入する
INSERT INTO customers (name, email)
VALUES (
(SELECT name FROM users WHERE id = 1),
(SELECT email FROM users WHERE id = 1)
);
- WITH 句を使用します。
注意事項
- 挿入先のテーブルと元のテーブルの列名が一致している必要があります。
- データ型も一致している必要があります。
- 主キーが重複する場合は、エラーが発生します。
-- テーブル `users`
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL
);
-- テーブル `customers`
CREATE TABLE customers (
id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL
);
-- データ挿入
INSERT INTO customers (name, email)
VALUES (
(SELECT name FROM users WHERE id = 1),
(SELECT email FROM users WHERE id = 1)
);
例2:orders
テーブルに products
テーブルの情報を結合して挿入
-- テーブル `products`
CREATE TABLE products (
id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
price DECIMAL(10,2) NOT NULL
);
-- テーブル `orders`
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
product_id INTEGER NOT NULL,
quantity INTEGER NOT NULL,
total_price DECIMAL(10,2) NOT NULL
);
-- データ挿入
INSERT INTO orders (product_id, quantity, total_price)
SELECT
p.id,
1,
p.price
FROM products p;
例3:SELECT INTO
コマンドを使用して新しいテーブルを作成
-- テーブル `users`
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL
);
-- 新しいテーブル `active_users` を作成
SELECT *
INTO active_users
FROM users
WHERE is_active = TRUE;
-- テーブル `users`
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL
);
-- 新しいテーブル `active_users` を作成
SELECT *
INTO active_users
FROM users
WHERE is_active = TRUE;
WITH 句
WITH
句は、複雑なクエリを複数の部分に分割して、読みやすく、理解しやすいコードを書くのに役立ちます。
-- テーブル `users`
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL
);
-- テーブル `customers`
CREATE TABLE customers (
id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL
);
-- WITH 句を使用して、`users` テーブルのデータを `customers` テーブルに挿入
WITH users_data AS (
SELECT name, email
FROM users
)
INSERT INTO customers (name, email)
SELECT *
FROM users_data;
PL/pgSQL 関数
PL/pgSQL 関数は、複雑なデータ処理や、繰り返し実行するタスクを自動化するのに役立ちます。
-- テーブル `users`
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL
);
-- テーブル `customers`
CREATE TABLE customers (
id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL
);
-- PL/pgSQL 関数を使用して、`users` テーブルのデータを `customers` テーブルに挿入
CREATE FUNCTION insert_users_into_customers()
RETURNS void AS
$$
BEGIN
INSERT INTO customers (name, email)
SELECT name, email
FROM users;
END;
$$ LANGUAGE plpgsql;
-- 関数を実行
SELECT insert_users_into_customers();
sql postgresql insert