戈登在his answer to your previous question指出的那樣,如果你要獨佔訪問表這種方法只適用。存在檢查與插入本身之間存在延遲,並且如果另一個進程在此窗口期間修改了表,則最終可能會出現重複項。
如果您使用的是Postgres 9.5+,最好的方法是跳過存在檢查並簡單地使用INSERT ... ON CONFLICT DO NOTHING
聲明。
在較早的版本中,最簡單的解決方案(如果您可以負擔得起)將在導入期間輸入lock the table。否則,你可以模擬ON CONFLICT DO NOTHING
(雖然效率較低)使用循環和異常處理程序:
DO $$
DECLARE r RECORD;
BEGIN
FOR r IN (SELECT * FROM holding) LOOP
BEGIN
INSERT INTO ltg_data (pulsecount, intensity, time, lon, lat, ltg_geom)
VALUES (r.pulsecount, r.intensity, r.time, r.lon, r.lat, r.ltg_geom);
EXCEPTION WHEN unique_violation THEN
END;
END LOOP;
END
$$
順便說一句,DELETE FROM holding
是耗時的,可能是不必要的。創建登臺表TEMP
,它將在會話結束時自動清除。您可以輕鬆地建立其結構相匹配的導入目標的表格:
CREATE TEMP TABLE holding (LIKE ltg_data);
文本的發佈的屏幕截圖是不是一個好主意,爲什麼不發佈文字本身? –
我想我可能會被問到。因爲我爲數據庫使用了遠程桌面連接,並且在嘗試複製/粘貼時最好不過了。另外,我認爲這是一個概念性問題,而讀者則試圖重新創建代碼並對其進行測試。 – user1610717
請檢查列''時間''是否有'null'值。 '空'值突破'不在'比較 –