Как в MySQL загрузить несколько таблиц из одной, сохранив при этом ссылочную целостность?

ОБНОВЛЕНИЕ: «Установка foreign_key_checks в 1 не запускает сканирование существующих данных таблицы. Следовательно, строки, добавленные в таблицу, когда foreign_key_checks = 0, не будут проверяться на согласованность». ИСТОЧНИК: 5.1.4. Системные переменные сервера - foreign_key_checks - - В результате кажется, что ОТКЛЮЧЕНИЕ foreign_key_checks НЕ является вариантом ...

Необходимо загрузить данные из одного файла с более чем 100 000 записей в несколько таблиц MySQL, поддерживая отношения, определенные в файле / таблицах; это означает, что отношения уже совпадают. Решение должно работать с последней версией MySQL и может использовать движок InnoDB или MyISAM.

Я новичок во всем этом, и у меня очень мало опыта автоматической генерации идентификаторов и установления отношений по внешнему ключу. Любые указатели будут оценены.

См. примечание UPDATE выше: Я мог бы добавить, что обновление действующей базы данных не является обязательным, это означает, что можно отключить ограничения внешнего ключа, затем выполнить вставки, включить снова ограничения. Поскольку я понимаю, что если что-то не так с ссылочной целостностью базы данных, операция завершится ошибкой.

Все подходы должны включать в себя некоторую проверку и стратегию отката / очистки в случае сбоя вставки или невозможности поддерживать ссылочную целостность.

Опять же, я совершенно не знаком с этим и делаю все возможное, чтобы предоставить как можно больше информации, если у вас есть какие-либо вопросы или просьбы о разъяснении - просто дайте мне знать.

Спасибо!


ОБРАЗЕЦ ДАННЫХ: Чтобы лучше проработать пример, давайте предположим, что я пытаюсь загрузить файл, содержащий имя сотрудника, офисы, которые они занимали в прошлом, и историю их должностей, разделенных табуляцией.

Файл:

EmployeeName<tab>OfficeHistory<tab>JobLevelHistory
John Smith<tab>501<tab>Engineer
John Smith<tab>601<tab>Senior Engineer
John Smith<tab>701<tab>Manager
Alex Button<tab>601<tab>Senior Assistant
Alex Button<tab>454<tab>Manager

ПРИМЕЧАНИЕ. База данных с одной таблицей полностью нормализована (насколько может быть одна таблица) - и, например, в случае с «Джоном Смитом» есть только один Джон Смит; Это означает, что нет дубликатов, которые могли бы привести к конфликтам в ссылочной целостности.

Схема базы данных MyOffice содержит следующие таблицы:

Employee (nId, name)
Office (nId, number)
JobTitle (nId, titleName)
Employee2Office (nEmpID, nOfficeId)
Employee2JobTitle (nEmpId, nJobTitleID)

Как я могу использовать MySQL для загрузки файла в схему, приведенную выше. Автоматическое создание идентификаторов для сотрудников, офиса и JobTitle, а также для поддержания связи между сотрудником и офисами, а также заголовками сотрудников и должностей?

Так в этом случае. таблицы должны выглядеть так:

Employee
1 John Smith
2 Alex Button

Office
1 501
2 601
3 701
4 454

JobTitle
1 Engineer
2 Senior Engineer
3 Manager
4 Senior Assistant

Employee2Office
1 1
1 2
1 3
2 2
2 4

Employee2JobTitle
1 1
1 2
1 3
2 4
2 3

person blunders    schedule 10.11.2010    source источник


Ответы (1)


Я бы загрузил все файлы в промежуточную базу данных со следующими таблицами:

Temp_Employee (nId, имя) Temp_Office (nId, number) ...

На этих таблицах не было бы никаких ограничений или FK. Если записи загружены, вы можете добавить идентификаторы для записей, проверить целостность, а затем переместить их в действующую базу данных (отключение fks, перемещение данных, повторное включение fks)

person HamoriZ    schedule 10.11.2010
comment
@Zoltan Hamori: Возможно, я скучаю по тебе, но похоже, что ты предлагаешь добавить идентификаторы вручную - это правильно? Думаю, я понял, что было бы разумнее, если бы MySQL генерировал их каждый раз, когда был обнаружен новый экземпляр. Кроме того, действительно нужен ответ, чтобы иметь необходимые операторы SQL, необходимые для выполнения задачи от начала до конца. - person blunders; 10.11.2010
comment
Когда ваши временные таблицы заполняются записями, вы просто обновляете столбец id последовательностью, чтобы ее можно было автоматизировать. Например: UPDATE temp_employee SET ID = seq_emp.NEXTVAL - person HamoriZ; 10.11.2010
comment
@Zoltan Hamori: Изучая ваше предложение, я столкнулся с проблемой, я был неправ ... если foreign_key_checks выключен, когда он снова включается, БД не будет проверять БД на предмет ссылочной целостности, поэтому отключение - это не вариант ... есть предложения? Я добавил обновление в текст моего вопроса, ссылаясь на MySQL DOC, в котором это говорится. Спасибо! - person blunders; 10.11.2010
comment
Хорошо, я вижу. Можно ли добавлять строки в таблицу? - person HamoriZ; 10.11.2010
comment
@Zoltan Hamori: Под добавлением вы подразумеваете пакетно или построчно? - person blunders; 10.11.2010
comment
Новые рекорды будут физически в самом конце таблицы. В этом случае процесс вставки выполняется намного быстрее. Я не уверен, что у mysql есть эта функция. - person HamoriZ; 10.11.2010
comment
@Zoltan Hamori: Вот как я закончил ... Ура! stackoverflow.com/questions/4175566/ - person blunders; 15.11.2010