ivaaaan
@ivaaaan
PHP developer

Как записать большое количество данных в базу с внешними ключами без дубликтов?

Есть около 30к записей в массиве вида username, city_name, company_name и есть таблицы users(id, name, city_id, company_id), cities(id, name), companies(id, name) с уже подзаполненными данными - cities около 35к записей, companies 1 миллион записей. Таблица users имеет внешние ключи к cities и companies

Мне нужно пройтись по всем данным из массива и вставить их в таблицу users с правильным внешними ключами для городов и компаний. Если города или компании нет в текущей базе, то нужно их создать и использовать созданные id.
Не представляю как-это лучше сделать. Т.к записей очень много, то делать запрос к базе в каждой итерации дорого(или нет?). Загружать все в память тоже не подходит(1 миллион записей просто не влезет в текущую конфигурацию)

Какой подход лучше выбрать?
  • Вопрос задан
  • 92 просмотра
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
ALTER TABLE `cities`
  ADD UNIQUE (`name`);

INSERT IGNORE INTO `cities` (`name`)
  SELECT DISTINCT `city_name` FROM `table`;

ALTER TABLE `companies`
  ADD UNIQUE (`name`);

INSERT IGNORE INTO `companies` (`name`)
  SELECT DISTINCT `company_name` FROM `table`;

INSERT INTO `users` (`name`, `city_id`, `company_id`)
  SELECT `t`.`name`, `c`.`id`, `o`.`id`
    FROM `table` AS `t`
    JOIN `cities` AS `c` ON `c`.`name` = `t`.`city_name`
    JOIN `companies` AS `o` ON `o`.`name` = `t`.`company_name`;
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы