我想向表中插入一条记录,如果该记录已经存在,则获取其 ID,否则运行插入并获取新记录的 ID。
我将插入数百万条记录,但不知道如何以有效的方式执行此操作。我现在正在做的是运行一个选择来检查记录是否已经存在,如果没有,则插入它并获取插入记录的 id。随着桌子越来越大,我想那SELECT
会杀了我。
我现在用 psycopg2 在 python 中做的事情是这样的:
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;
关于如何优化这样的案例的任何想法?