我在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