我需要更新一个查询,以便在插入之前检查是否存在重复的条目。在MySQL中,我可以使用INSERT IGNORE,这样如果找到重复的记录,它只是跳过插入,但我似乎找不到Oracle的等效选项。有什么建议吗?
答案 0 :(得分:28)
查看MERGE语句。这应该做你想要的 - 这是WHEN NOT MATCHED
子句将执行此操作。
Oracle缺乏对真正的VALUES()子句的支持,但是具有固定值的单个记录的语法非常笨拙:
MERGE INTO your_table yt
USING (
SELECT 42 as the_pk_value,
'some_value' as some_column
FROM dual
) t on (yt.pk = t.the_pke_value)
WHEN NOT MATCHED THEN
INSERT (pk, the_column)
VALUES (t.the_pk_value, t.some_column);
另一种方法(例如,如果您从另一个表进行批量加载)是使用Oracle的“错误日志记录”工具。声明如下:
INSERT INTO your_table (col1, col2, col3)
SELECT c1, c2, c3
FROM staging_table
LOG ERRORS INTO errlog ('some comment') REJECT LIMIT UNLIMITED;
之后,表errlog
中提供了所有可能引发错误的行。在使用errlog
运行插入之前,您需要手动创建DBMS_ERRLOG.CREATE_ERROR_LOG
表(或您选择的任何名称)。
有关详细信息,请参阅手册
答案 1 :(得分:19)
如果您使用11g,则可以使用提示IGNORE_ROW_ON_DUPKEY_INDEX:
SQL> create table my_table(a number, constraint my_table_pk primary key (a));
Table created.
SQL> insert /*+ ignore_row_on_dupkey_index(my_table, my_table_pk) */
2 into my_table
3 select 1 from dual
4 union all
5 select 1 from dual;
1 row created.
答案 2 :(得分:8)
我不认为只是为了省时间你可以尝试插入并忽略不可避免的错误:
begin
insert into table_a( col1, col2, col3 )
values ( 1, 2, 3 );
exception when dup_val_on_index then
null;
end;
/
这将忽略由重复主键或唯一键约束特别引发的异常;其他一切都将照常提升。
如果您不想这样做,那么您必须首先从表格中进行选择,这实际上效率不高。
答案 3 :(得分:4)
另一种变体
Insert into my_table (student_id, group_id)
select distinct p.studentid, g.groupid
from person p, group g
where NOT EXISTS (select 1
from my_table a
where a.student_id = p.studentid
and a.group_id = g.groupid)
或者你可以做到
Insert into my_table (student_id, group_id)
select distinct p.studentid, g.groupid
from person p, group g
MINUS
select student_id, group_id
from my_table
答案 4 :(得分:1)
一个简单的解决方案
insert into t1
select from t2
where not exists
(select 1 from t1 where t1.id= t2.id)
答案 5 :(得分:0)
如何简单地添加索引以及检查dupes所需的任何字段,并说它必须是唯一的?保存读取检查。
答案 6 :(得分:0)
这个不是我的,但在使用sqlloader时非常方便:
创建一个指向您的表的视图:
CREATE OR REPLACE VIEW test_view
AS SELECT * FROM test_tab
创建触发器:
CREATE OR REPLACE TRIGGER test_trig
INSTEAD OF INSERT ON test_view
FOR EACH ROW
BEGIN
INSERT INTO test_tab VALUES
(:NEW.id, :NEW.name);
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN NULL;
END test_trig;
并在ctl文件中,插入到视图中:
OPTIONS(ERRORS=0)
LOAD DATA
INFILE 'file_with_duplicates.csv'
INTO TABLE test_view
FIELDS TERMINATED BY ','
(id, field1)
答案 7 :(得分:0)
还有另一个“不存在的地方”-使用双重...变体...
insert into t1(id, unique_name)
select t1_seq.nextval, 'Franz-Xaver' from dual
where not exists (select 1 from t1 where unique_name = 'Franz-Xaver');