SQL ORACLE INSERT INTO - 如何检查存在之前

时间:2013-07-03 15:24:53

标签: oracle11g sql-insert

我转储了一个数据库表,我必须在新数据库上传输具有相同结构的表上的行。 在新表上已经有一些行,所以我只有在主键不存在时才插入新值。 作为数据库,我正在使用Oracle 11.6。

...
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'已经存在于数据库中,我如何避免执行查询时出错?

谢谢

1 个答案:

答案 0 :(得分: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 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