Поиск и обновление на INSERT

Клиенту необходимо перенести большой объем данных, и я считаю, что этот вопрос может быть достаточно общим для SO.

Устаревшая система

Профили студентов содержат такие поля, как имена, адреса электронной почты и т. д., а также название университета. Название университета представлено в виде строки и поэтому повторяется, что является расточительным и медленным.

Наша новая форма

Более эффективное решение состоит в том, чтобы иметь таблицу с именем university, в которой имя университета хранится только один раз с внешним ключом (university_id), а раскрывающийся список HTML просто отправляет university_id на сервер. Это значительно ускоряет выполнение, например, GROUP BY запросов. Новые данные формы, поступающие в базу данных, работают нормально.

Проблема

Как мы можем написать запрос, который будет ВСТАВЛЯТЬ все остальные столбцы (first_name, last_name, email, ...), но затем вместо того, чтобы вставлять строку university, узнавать ее university_id из таблицы university и вместо этого ВСТАВЛЯТЬ соответствующий int исходной строки? (сценарий: данные находятся в файле CSV, который мы будем обрабатывать в синтаксисе INSERT INTO)

Большое спасибо.


person ABCTaylor    schedule 20.06.2018    source источник


Ответы (1)


Используйте INSERT INTO ... SELECT с LEFT JOIN. Левый выбран таким образом, что запись студента не будет удалена, если она имеет нулевое значение для University_name.

INSERT INTO students_new(first_name, last_name, email, university_id)
SELECT s.first_name, s.last_name, s.email, u.university_id
FROM students_old s
LEFT JOIN university u ON s.university_name = u.university_name

Имена таблиц и столбцов заменить на настоящие. Выше предполагается, что ваша новая таблица для студентов, имеющих внешний ключ к университету, имеет номер students_new, а старая таблица (до нормализации) — students_old.

person Kamil Gosciminski    schedule 20.06.2018
comment
Миграция прошла успешно, и JOIN, представленный выше, работал безупречно. - person ABCTaylor; 21.06.2018