2013-05-07 135 views
0

我在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版本)。

回答

1

合并使用using而不是from

merge into myTable t1 USING (
    select 42 as the_pk_value, 'TEST' as some_column from dual 
) t2 on (t1.id = t2.the_pk_value) 
+0

你的语法使用SQL开发人员确实工作。但是...由于某种原因,从Java调用'ORA-00001:唯一约束(PK_MYTABLE)违反'会出现。该错误消息确实打印了确切的SQL查询,当我在SQL Developer中复制粘贴它时,它完美地工作(第一条消息:1行合并。后面的消息:0行合并)。任何想法 ? – Wis 2013-05-07 10:16:40

+0

不确定,我不是Java专家。也许用代码片段发布一个新的Java问题? – Andomar 2013-05-07 10:40:36

+0

我怀疑Oracle驱动程序有什么......现在我接受你的解决方案,你给了我一个有效的Oracle答案(即使它通过Java调用失败了)。 – Wis 2013-05-07 11:51:53