既存のデータベースにデータを挿入または更新するために、迅速な 1 回限りの SQL ファイルをよく使用します。SQL は通常、開発者によって記述され、開発システムでテストされてから、psql -U dbuser dbname < file.sql
.
(些細な)例は次のようになります。
INSERT INTO employees (
company_id,
name,
position,
created_by,
last_modified_by
) VALUES
(
(SELECT id FROM companies WHERE name = 'Acme Fellowship'),
'Frodo Baggins',
'Ring bearer',
(SELECT id FROM users WHERE login = 'admin'),
(SELECT id FROM users WHERE login = 'admin')
),
(
(SELECT id FROM companies WHERE name = 'Acme Fellowship'),
'Samwise Gamgee',
'Rope bearer',
(SELECT id FROM users WHERE login = 'admin'),
(SELECT id FROM users WHERE login = 'admin')
),
(
(SELECT id FROM companies WHERE name = 'Acme Fellowship'),
'Peregrin Took',
'Ent rider',
(SELECT id FROM users WHERE login = 'admin'),
(SELECT id FROM users WHERE login = 'admin')
);
これは機能しますが、サブクエリには多くの反復コードがあります。companies.id
関連する値をおよびusers.id
一時変数に格納すると便利です (より効率的でエラーが発生しにくくなります) 。この解釈された例では、パフォーマンスの違いはおそらく最小限ですが、実際にはより複雑なクエリと更新があり、更新/挿入されたレコードが 3 つ以上あることがよくあります。
MySQL 用に記述された同じ例は、次のようになります。
SELECT @company_id := id FROM companies WHERE name = 'Acme Fellowship';
SELECT @admin_id := id FROM users WHERE login = 'admin';
INSERT INTO employees (
company_id,
name,
position,
created_by,
last_modified_by
) VALUES
(@company_id, 'Frodo Baggins', 'Ring bearer', @admin_id, @admin_id),
(@company_id, 'Samwise Gamgee', 'Rope bearer', @admin_id, @admin_id),
(@company_id, 'Peregrin Took', 'Ent rider', @admin_id, @admin_id);
PostgreSQL で同様のことを達成する方法はありますか?
私が見たもの:
- psql のセッション変数 (with
\set
): クエリ結果の保存には使用できません - plpgsql: プロシージャでのみ使用できます (まだ 8.4 を実行しています)
- 一時テーブル: 見苦しく複雑なステートメントを作成せずにそれらを使用する方法がわかりません
Postgres に直接相当するものがない場合、この種の更新ファイルを作成する最も不器用な方法は何だと思いますか?