假设我有一张table real_table
列1上有主键。
我可以这样加载数据:
insert into real_table
SELECT * FROM EXTERNAL (
(col1 VARCHAR2 (50),
col2 VARCHAR2 (50),
col3 VARCHAR2 (50),
col4 VARCHAR2 (50) )
TYPE ORACLE_LOADER
DEFAULT DIRECTORY data_to_input
ACCESS PARAMETERS (
RECORDS DELIMITED BY NEWLINE
skip 1
FIELDS TERMINATED BY ','
MISSING FIELD VALUES ARE NULL
)
LOCATION ('data.CSV')
REJECT LIMIT UNLIMITED) ext
where not exists (
select * from real_table r
where r.col1 = ext.col1
);
但这意味着我必须手动指定pks。对于一个相对较小的表来说,手工操作并不是一个大问题。我也可以这样做:
insert into real_table
SELECT * FROM EXTERNAL (
(col1 VARCHAR2 (50),
col2 VARCHAR2 (50),
col3 VARCHAR2 (50),
col4 VARCHAR2 (50) )
TYPE ORACLE_LOADER
DEFAULT DIRECTORY data_to_input
ACCESS PARAMETERS (
RECORDS DELIMITED BY NEWLINE
skip 1
FIELDS TERMINATED BY ','
MISSING FIELD VALUES ARE NULL
)
LOCATION ('data.CSV')
REJECT LIMIT UNLIMITED) ext
where not exists (
select * from real_table r
where r.col1 = ext.col1
and r.col2 = ext.col2
and r.col3 = ext.col3
and r.col4 = ext.col4
);
但是对于一个有10或20列的表,我该怎么办呢?我的解决方案对一张大table来说是不是很可笑?我不是在抱怨必须把东西打出来,我在想,检查每一条记录所需的处理是否荒谬。我的解决方案是不是某种典型的noob错误?人们如何确保他们的记录是独一无二的?
另外,如果我试图一次输入一条记录,而它是一个副本,我的数据库只会给这个副本它自己的唯一pk(我将pk列定义为 NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY
)
我一直在对自己说,“pk将确保记录的唯一性!pk能解决我所有的问题,还能治愈癌症!”我真不敢相信,我花了这么长时间才意识到,那些独特的记录可能仍然是彼此的复制品。
1条答案
按热度按时间0wi1tuuw1#
您用来插入到real\表中的查询很容易成为将大量数据加载到数据库中的最佳方法。。
这是因为数据库认为这是一个简单的sql,而不是检查每一行的重复项+插入一行,然后插入下一行,以此类推。
为了确保唯一性,您只需要将real\ u表中的唯一列与外部表中相应的列进行比较,但如果您有一个平面文件,其中所有列都是唯一的,这将是非常不寻常的。