我有一些大表(数百万行)。我经常收到包含要添加到这些表中的新行的文件 - 每天最多5000万行。我收到的大约0.1%的行是我已经加载的行的重复(或者是文件中的重复行)。我想阻止那些行被加载到表中。
我目前使用SQL Loader以获得足够的性能来应对我的大数据量。如果我采取明显的步骤并在列上添加唯一索引,无论行是否重复,SQL Loader将开始使包含重复行的整个文件失败 - 而我只想防止重复的行本身正在加载。
我知道在SQL Server和Sybase中我可以创建一个带有'Ignore Duplicates'属性的唯一索引,如果我然后使用BCP,则不会加载重复的行(由该索引定义)。
有没有办法在Oracle中实现相同的效果?
我不想在加载后删除重复的行 - 对我来说重要的是它们永远不应该被加载。
答案 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