我转储了一个数据库表,我必须在新数据库上传输具有相同结构的表上的行。 在新表上已经有一些行,所以我只有在主键不存在时才插入新值。 作为数据库,我正在使用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'已经存在于数据库中,我如何避免执行查询时出错?
谢谢
答案 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