假设我有一个real_table
在column1上有主键的表。
我可以像这样将数据加载到其中:
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
);
但这意味着我必须手动指定PK。对于相对较小的表,手动进行操作不是一个大问题。我也可以这样做:
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列的表我该怎么办?我的解决方案对于一张大桌子来说可笑吗?我不是在抱怨必须输入内容,我想知道检查每条记录所需的处理是否很荒谬。我的解决方案是某种经典的菜鸟错误吗?人们如何确保自己的记录是唯一的?
另外,如果我尝试一次输入一个记录,并且它是重复记录,那么我的数据库将为该重复记录提供自己的唯一PK。(我将PK列定义为NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY
)
我一直在对自己说:“ PK将确保记录是唯一的!PK将解决我所有的问题并治愈癌症!” 我不敢相信我花了这么长时间才意识到那些独特的记录仍然可能是彼此重复的。
您用来插入real_table的查询很容易是将批量数据加载到数据库中的最佳方法。
insert
into dest_table
select <cols>
from source_table
where exists (select * from dest_table where <equate on unique keys>
这是因为数据库只看到一个简单的SQL,而不会检查每行是否重复,而是先插入一行,然后再插入下一行,依此类推等等。
为了确保唯一性,您只需要将real_table中的唯一列与外部表中的对应列进行比较,但是如果您拥有一个包含所有列都是唯一的平面文件,那将是非常不寻常的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句