我想插入一條記錄到表中,如果記錄已經存在,請獲取其ID,否則運行插入並獲取新記錄的ID。如果值不存在,則插入新行並獲取id
我將插入數百萬條記錄,不知道如何以有效的方式做到這一點。我現在正在做的是運行select來檢查記錄是否已經存在,如果沒有,插入它並獲取插入記錄的ID。隨着桌子的增長,我想像SELECT
會殺了我。
我現在正在做與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;
如何優化的任何想法像這樣的情況?
看來你正在試圖實現一個upsert。請參閱http://www.depesz.com/2012/06/10/why-is-upsert-so-complicated/ –
[UPDATE/INSERT基於行是否存在]的可能重複(http://stackoverflow.com/questions/11559420/update-insert-based-on-if-a-row-exists) –
我不相信這是一個upsert。我沒有做任何更新。我有數百萬條重複記錄,如果它已經在數據庫中,我需要記錄的ID。 – Cricri