如何防止将重复行加载到Oracle表中?

时间:2009-10-19 13:09:11

标签: oracle duplicates

我有一些大表(数百万行)。我经常收到包含要添加到这些表中的新行的文件 - 每天最多5000万行。我收到的大约0.1%的行是我已经加载的行的重复(或者是文件中的重复行)。我想阻止那些行被加载到表中。

我目前使用SQL Loader以获得足够的性能来应对我的大数据量。如果我采取明显的步骤并在列上添加唯一索引,无论行是否重复,SQL Loader将开始使包含重复行的整个文件失败 - 而我只想防止重复的行本身正在加载。

我知道在SQL Server和Sybase中我可以创建一个带有'Ignore Duplicates'属性的唯一索引,如果我然后使用BCP,则不会加载重复的行(由该索引定义)。

有没有办法在Oracle中实现相同的效果?

我不想在加载后删除重复的行 - 对我来说重要的是它们永远不应该被加载。

5 个答案:

答案 0 :(得分:5)

“复制”是什么意思?如果您有一个定义唯一行的列,则应为该列设置唯一约束。通常在此列上创建一个唯一索引,它将自动设置约束。

编辑: 是的,如下所述,您应该为SQL * Loader设置一个“坏”文件来捕获无效行。但我认为从数据完整性的角度来看,建立唯一索引可能是一个好主意。

答案 1 :(得分:2)

使用Oracle MERGE语句。一些解释here

答案 2 :(得分:2)

您没有告知您的Oracle版本。看一下merge command

基本上就像这样

---- Loop through all the rows from a record temp_emp_rec
MERGE INTO hr.employees e
     USING temp_emp_rec t
     ON (e.emp_ID = t.emp_ID)
     WHEN MATCHED THEN
    --- _You can update_
    UPDATE
     SET first_name = t.first_name,
          last_name = t.last_name
    --- _Insert into the table_
    WHEN NOT MATCHED THEN
    INSERT (emp_id, first_name, last_name)
    VALUES (t.emp_id, t.first_name, t.last_name); 

答案 3 :(得分:1)

我会使用在适当的表列上定义的完整性约束。

Oracle概念手册中的这个page给出了概述,如果您也向下滚动,您将看到可用的约束类型。

答案 4 :(得分:1)

使用下面的选项,如果在你的sqlldr终止之后你会得到这么多的错误9999999。

OPTIONS (ERRORS=9999999, DIRECT=FALSE )
LOAD DATA

您将在错误文件中获得重复记录。

sqlldr user/password@schema CONTROL=file.ctl, LOG=file.log, BAD=file.bad