sql—如何在不手动指定pk的情况下将唯一数据加载到oracle表中?

kognpnkq  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(257)

假设我有一张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能解决我所有的问题,还能治愈癌症!”我真不敢相信,我花了这么长时间才意识到,那些独特的记录可能仍然是彼此的复制品。

0wi1tuuw

0wi1tuuw1#

您用来插入到real\表中的查询很容易成为将大量数据加载到数据库中的最佳方法。。

insert 
  into dest_table
 select <cols>
  from source_table
 where exists (select * from dest_table where <equate on unique keys>

这是因为数据库认为这是一个简单的sql,而不是检查每一行的重复项+插入一行,然后插入下一行,以此类推。
为了确保唯一性,您只需要将real\ u表中的唯一列与外部表中相应的列进行比较,但如果您有一个平面文件,其中所有列都是唯一的,这将是非常不寻常的。

相关问题