テーブルにレコードを挿入したいのですが、レコードが既に存在する場合はその ID を取得し、そうでない場合は挿入を実行して新しいレコードの ID を取得します。
何百万ものレコードを挿入する予定ですが、これを効率的に行う方法がわかりません。私が今していることは、選択を実行してレコードが既に存在するかどうかを確認し、存在しない場合は挿入して、挿入されたレコードの ID を取得することです。テーブルが大きくなるにつれて、それSELECT
が私を殺そうとしていると思います。
python で psycopg2 を使用して現在行っていることは次のようになります。
select = ("SELECT id FROM ... WHERE ...", [...])
cur.execute(*select)
if not cur.rowcount:
insert = ("INSERT INTO ... VALUES ... RETURNING id", [...])
cur.execute(*insert)
rid = cur.fetchone()[0]
次のようなストアド プロシージャで何かを行うことは可能でしょうか。
BEGIN
EXECUTE sql_insert;
RETURN id;
EXCEPTION WHEN unique_violation THEN
-- return id of already existing record
-- from the exception info ?
END;
このようなケースを最適化する方法についてのアイデアはありますか?