У меня есть огромный XML-файл (около 60 ГБ), из которого мне нужно извлечь данные. Я получаю новый обновленный XML-файл один раз в неделю, и мне нужно обновить данные в моей базе данных. Это файл с информацией о каждом автомобиле в Дании, поэтому информация каждого элемента может измениться с одной недели на другую. Мне удалось создать программу, которая может прочитать этот файл и извлечь каждый элемент и проанализировать его в моей базе данных. В настоящее время в XML-файле содержится 8 400 000 элементов. Сначала я попытался загрузить каждую строку в мою базу данных по одному разу, и мне удалось только вставить около 300 строк в секунду. Затем потребуется 7-8 часов, чтобы вставить все 8,4 миллиона строк. Поэтому я изменил свой читатель, чтобы сохранить 5000 записей во временной таблице данных, а затем объединить все 5000 строк сразу. Это увеличило мою скорость чтения/вставки до 7000 строк/сек. Огромное улучшение. Теперь я загружаю все элементы менее чем за 20 минут. Моя проблема в том, что я не могу обновить таблицу при использовании массовой вставки. Некоторые элементы перечислены дважды в файле XML по какой-либо причине, поэтому мне нужно удалить дубликаты в моей таблице, прежде чем добавить первичный ключ.Объединить 2 таблицы SQL в первичном ключе - обновить существующие и вставить новые строки
Мое текущее решение создать 2 таблицы в моей базе данных: dbo.eStatistik и dbo.eStatistikLoad
Затем я использую мой читатель, чтобы извлечь все 8400000 элементы из нового файла XML и навалом вставить их в DBO .eStatistikLoad. Когда все элементы находятся в dbo.eStatistikLoad, я удалю все повторяющиеся строки, а затем установлю столбец (KoeretoejIdent) в качестве моего ПЕРВИЧНОГО КЛЮЧА. Как только это будет сделано, я хочу обновить каждую существующую строку в dbo.eStatistik с данными из dbo.eStatistikLoad и вставить новые строки в dbo.eStatistik с данными из dbo.eStatistikLoad.
В настоящее время я могу вставлять и удалять повторяющиеся строки просто отлично, но я не знаю, как обновлять существующие строки и вставлять новые строки между двумя таблицами. Как уже отмечалось в обеих таблицах есть первичный ключ (KoeretoejIdent) после того, как я удалил дубликаты: Я пробовал эти команды, но я получаю сообщение об ошибке:
INSERT
INTO dbo.eStatistik
SELECT *
FROM dbo.eStatistikLoad
ON DUPLICATE KEY
UPDATE
dbo.eStatistik.KoeretoejIdent = dbo.eStatistikLoad.KoeretoejIdent
dbo.eStatistik.KoeretoejArtNavn = dbo.eStatistikLoad.KoeretoejArtNavn
dbo.eStatistik.KoeretoejAnvendelseNavn = dbo.eStatistikLoad.KoeretoejAnvendelseNavn
Я получаю следующее сообщение об ошибке:
Msg 156, Level 15, State 1, Line 52
Incorrect syntax near the keyword 'ON'.
Msg 102, Level 15, State 1, Line 54
Incorrect syntax near '='.
Я также попробовал эти две команды, но получить ту же ошибку:
/* COMMAND 1 */
REPLACE INTO dbo.eStatistik SELECT * FROM dbo.eStatistikLoad
/* COMMAND 2 */
INSERT IGNORE
INTO dbo.eStatistik
SELECT *
FROM dbo.eStatistikLoad
;
я получаю ту же ошибку при использовании обоих команд:
Msg 156, Level 15, State 1, Line 70
Incorrect syntax near the keyword 'INTO'.
Ваше сообщение об ошибке выглядит как SQL Server. Ссылки на таблицы и использование XML также предлагают SQL Server. Тем не менее, ваш запрос использует синтаксис MySQL. 'ON DUPLICATE KEY' относится к MySQL. –
Наличие отдельной таблицы для загрузки XML-данных в порядке. Фактически, это часто используемый подход. Эта концепция называется «постановка». Для вашей проблемы вам нужно что-то другое, кроме значения, генерируемого базой данных, чтобы идентифицировать записи в вашей основной таблице. Это будет база данных автомобилей, возможно, идентификационный номер транспортного средства будет полезен. –