Как я могу загрузить только уникальные данные в мою таблицу oracle без указания PK вручную? - PullRequest
0 голосов
/ 01 августа 2020

Допустим, у меня есть таблица 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
    );

Но это означает, что я должен указать ПК вручную. Выполнение этого вручную - не большая проблема для относительно небольшого стола. Я также могу сделать это:

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 столбцов? Было бы нелепо мое решение для большого стола? Я не жалуюсь на то, что нужно что-то печатать, мне интересно, будет ли обработка, необходимая для проверки каждой записи, нелепой. Является ли мое решение какой-то классной c ошибкой noob? Как люди гарантируют, что их записи уникальны?

Кроме того, если я попытаюсь ввести одну запись за раз, и это будет дубликат, моя база данных просто предоставит этому дубликату свой собственный уникальный PK. (У меня столбцы PK определены как NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY)

Все это время я говорил себе, что «PK обеспечит уникальность записей! PK решит все мои проблемы, а также вылечит рак. ! " Не могу поверить, что мне понадобилось так много времени, чтобы осознать, что эти уникальные записи могут быть дубликатами друг друга.

1 Ответ

1 голос
/ 01 августа 2020

Запрос, который вы использовали для вставки в real_table, легко является лучшим способом загрузки большого объема данных в базу данных. go не проверяет каждую строку на наличие дубликатов + вставляет одну строку, за которой следует следующая строка и так далее, и так далее.

Для обеспечения уникальности вам нужно будет только сравнить уникальные столбцы в real_table с соответствующие столбцы во внешней таблице, было бы очень необычно, если бы у вас был плоский файл со всеми столбцами как уникальными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...