Допустим, у меня есть таблица 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 решит все мои проблемы, а также вылечит рак. ! " Не могу поверить, что мне понадобилось так много времени, чтобы осознать, что эти уникальные записи могут быть дубликатами друг друга.