我在Oracle Equivalent to MySQL INSERT IGNORE? 上發現了一個非常類似的話題但是,我無法使任何建議的解決方案成功。我的情況有點特別,因爲我的表只包含1個字段,這是主鍵。我們在下面調用字段「id」和表「myTable」。Oracle相當於INSERT IGNORE
使用合併
merge into myTable t1 from (
select 42 as the_pk_value, 'TEST' as some_column from dual
) t2 on (t1.id = t2.the_pk_value)
when not matched then
insert (id) values (t2.the_pk_value);
這第一次嘗試給出一個SQL Error: ORA-02012: missing USING keyword
錯誤消息。我不得不承認,我不明白提出的語法,所以也許我在適應我的pk-only表時弄糟了一些東西。但由於示例沒有使用任何USING
關鍵字,我不明白我的錯誤可能在哪裏。
使用提示
insert /*+ ignore_row_on_dupkey_index(SPSECU, PK_SPSECU) */ into myTable (id) values ('TEST');
這並通過SQL開發工作,但是它並沒有從Java工作(我懷疑OJDBC驅動程序刪除這些註釋,以減少傳輸大小。BTW我無法弄清楚哪些我使用......春節工具的源束似乎沒有任何進一步的配置Oracle數據庫連接JDBC驅動程序。我看到僅安裝了DERBY默認的驅動程序。
使用NOT EXISTS
我無法使此語法工作。下面是我寫的:
insert into myTable (id) values ('TEST') where not exists (select id from myTable where id='TEST');
我得到一個錯誤SQL Error: ORA-00933: SQL command not properly ended
此版本。
使用INSERT選擇
我不明白的knagaev提出的解決方案的任何東西......試圖使其適應我的表給了我這個:
insert into myTable t1 select id from myTable t2 where not exists (select 1 from t1 where t1.id = 'TEST');
有人能幫助我嗎?我習慣了MySQL INSERT IGNORE簡單的語法,並且在Oracle上很新(使用11g版本)。
你的語法使用SQL開發人員確實工作。但是...由於某種原因,從Java調用'ORA-00001:唯一約束(PK_MYTABLE)違反'會出現。該錯誤消息確實打印了確切的SQL查詢,當我在SQL Developer中複製粘貼它時,它完美地工作(第一條消息:1行合併。後面的消息:0行合併)。任何想法 ? – Wis 2013-05-07 10:16:40
不確定,我不是Java專家。也許用代碼片段發佈一個新的Java問題? – Andomar 2013-05-07 10:40:36
我懷疑Oracle驅動程序有什麼......現在我接受你的解決方案,你給了我一個有效的Oracle答案(即使它通過Java調用失敗了)。 – Wis 2013-05-07 11:51:53