2013-07-03 91 views
1

檢查存在我有一個數據庫表的轉儲和我有一個新的數據庫具有相同結構的轉移上表中的行。 在新表中已經有一些行所以我只有主鍵是不存在插入新的值。作爲數據庫我使用的是Oracle 11.6。ORACLE SQL INSERT INTO - 如何前

... 
INSERT INTO TABLE1 (KEY, FIELD1, FIELD2) VALUES ('1111111','aaa','xxx'); 
INSERT INTO TABLE1 (KEY, FIELD1, FIELD2) VALUES ('2222222','bbb','yyy'); 
INSERT INTO TABLE1 (KEY, FIELD1, FIELD2) VALUES ('3333333','ccc','zzz'); 
... 

如果鍵'2222222'已經在數據庫中,我該如何避免從查詢的執行中產生錯誤?

謝謝

+0

可能重複甲骨文:如何UPSERT(?更新或插入表)(http://stackoverflow.com/questions/237327 /甲骨文如何對UPSERT更新或 - 插入 - 到 - 一個表) – antlersoft

回答

2

您可以爲每個記錄做到這一點:

MERGE INTO TABLE1 mt 
USING (
    SELECT '2222222' as KEY, 
      'bbb' as FIELD1, 
      'yyy' as FIELD2 
    FROM dual 
) t on (mt.key = t.key) 
WHEN NOT MATCHED THEN 
    INSERT (KEY, FIELD1, FIELD2) 
    VALUES (t.KEY, t.FIELD1, t.FIELD2); 

但是,它可能會幫助先插入一個臨時表TABLE1_TEMP一切。 則只能運行一個MERGE語句:

MERGE INTO TABLE1 mt 
USING (
    SELECT KEY,   -- more interesting 
      FIELD1,  -- to merge all this 
      FIELD2  -- at once instead of 
    FROM TABLE1_TEMP -- just one record 
) t on (mt.key = t.key) 
WHEN NOT MATCHED THEN 
    INSERT (KEY, FIELD1, FIELD2) 
    VALUES (t.KEY, t.FIELD1, t.FIELD2); 

然後下降TABLE1_TEMP

+0

的解決方案是好的,但如果該記錄已在數據庫中,我不想更新/覆蓋它。 我需要避免插入/更新,如果是已經在數據庫中。 – Ultramito

+0

這正是上述說法。因爲沒有'WHEN MATCHED'子句,只有'WHEN MATCHED'。 –