既存のデータベースにデータを挿入または更新するために、迅速な一時的なSQLファイルを使用することがよくあります。 SQLは通常、開発者によって書かれ、開発システムでテストされた後、psql -U dbuser dbname < file.sql
で本番DBにインポートされます。PostgreSQLのMySQLの変数を置き換えますか?
A(ささい)の例では、次のようになります。
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')
);
これは動作しますが、サブクエリでの反復コードがたくさんあります。と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で似た何かを達成する方法はありますか?
私が見てきたどのような:のみ手順で使用することができます(私たちはまだ実行している:ストアクエリに使用することはできませんが、
\set
付き)
- psqlのセッション変数8.4)
- 一時テーブル:私はPostgresのための直接対応がない場合、あなたはwをどう思いますか
醜いと複雑な文を作成することなく、それらを使用する方法を見ることができませんこの種の更新ファイルを作成するには、少なくとも不器用な方法ですか? SELECTで
非常に優雅に、ありがとうございます。 – Zilk
CTEはバージョン8.4では動作しませんが、INSERTをサポートしていません。これには少なくともバージョン9.1が必要です。 –
@FrankHeikens:良い点。そのため、私はここでサブクエリを使用しました。 –