查看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);
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.
1
我不认为只是为了节省时间你可以尝试插入并忽略不可避免的错误:
begin
insert into table_a( col1, col2, col3 )
values ( 1, 2, 3 );
exception when dup_val_on_index then
null;
end;
/
这只会忽略由重复主键或唯一键约束特别引发的异常;其他一切都将照常提升 .
如果你不想这样做,那么你必须先从表中选择,这实际上并不那么有效 .
26
另一种变体
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
17
简单的解决方案
insert into t1
select from t2
where not exists
(select 1 from t1 where t1.id= t2.id)
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 回答
查看MERGE语句 . 这应该做你想要的 - 这是
WHEN NOT MATCHED
条款将做到这一点 .对Oracle缺乏对真正的VALUES()子句的支持,具有固定值的单个记录的语法是非常笨拙的:
另一种方法(如果您是从不同的表进行批量加载)是使用Oracle的“错误日志记录”工具 . 声明如下:
之后,表
errlog
中提供了所有抛出错误的行 . 在使用DBMS_ERRLOG.CREATE_ERROR_LOG
运行插入之前,需要手动创建errlog
表(或您选择的任何名称) .有关详细信息,请参阅手册
如果您使用11g,则可以使用提示IGNORE_ROW_ON_DUPKEY_INDEX:
我不认为只是为了节省时间你可以尝试插入并忽略不可避免的错误:
这只会忽略由重复主键或唯一键约束特别引发的异常;其他一切都将照常提升 .
如果你不想这样做,那么你必须先从表中选择,这实际上并不那么有效 .
另一种变体
或者你可以做到
简单的解决方案
如何简单地添加一个索引,你需要检查哪些字段,并说它必须是唯一的?保存读取检查 .
这个不是我的,但在使用sqlloader时非常方便: