Как импортировать файл .xls в .sql с внешним ключом
У меня есть таблица Excel:
id name region zone
1 pokin Polon Riny
2 lucy yerni kinta
...
И у меня есть таблицы в базе данных mysql, у которых вместо region_id
и zone_id
есть внешние ключи к id в области и зоне.
таблица пользователей:
id name region_id zone_id
1 retre 1 1
...
таблица областей:
id region_name
1 Polon
...
и таблица зон
id zone_name
1 kinta
...
Мне нужно импортировать таблицу Excel в таблицу users.
Ответы
Ответ 1
- Экспортируйте таблицу так, как вы показываете ее в электронной таблице (с прописанными именами).
- Импортируйте это в MySQL - скажем, в таблицу
X
- Выполните следующий запрос, чтобы выполнить "нормализацию" при создании нужной таблицы (с номерами вместо имен):
Что-то вроде этого:
INSERT INTO users
(id, name, region_id, zone_id)
SELECT X.id, X.name, r.id, z.id
FROM X
LEFT JOIN region AS r ON r.region_name = X.region
LEFT JOIN zone AS z ON z.zone_name = X.zone;
Если id
является AUTO_INCREMENT
, то вы можете сделать это немного по-другому. (Оставьте id
из INSERT
и SELECT
.)
Я использовал LEFT
на случай, если есть пропущенные регионы или зоны. В этом случае вы получите NULLs
или значения по умолчанию для region_id
или zone_id
, что указывает на необходимость исправления чего-либо.
Ответ 2
Я предлагаю, чтобы в вашем листе .xls заменили имена зон и регионов на фактические идентификаторы в базе данных для этих полей. Затем вы можете экспортировать свой файл xls в файл csv, а затем легко импортировать его в свою базу данных с помощью mysqlimport
mysqlimport --ignore-lines=1 \
--fields-terminated-by=, \
--local -u root \
-p DatabaseName \
YourExportedFile.csv
Несколько вещей, чтобы рассмотреть здесь:
- Путь к файлу, когда вы выполняете команду.
- Символ fiels-terminate-by
- "- p DatabaseName", DatabaseName не является паролем, является вашим именем базы данных, при выполнении команды будет запрашиваться пароль.
Вы можете импортировать CSV файл с помощью оператора SQL, используя LOAD DATA INFILE
LOAD DATA INFILE "/home/user/YourExportedFile.csv"
INTO TABLE YOUR_TABLE
COLUMNS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
ESCAPED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES;
Кроме того, если вы используете графический клиент MySQL (mysql workbench, heideSql, mysqlpro и т.д.), вы можете использовать функцию импорта.
Ответ 3
Предполагая, что ни одна из этих таблиц не существует, сначала создайте три CSV файла users.csv, regions.csv, zone.csv.
regions.csv и зоны .csv будут иметь один столбец, который вы можете импортировать в БД, это имя области или имя зоны. Я предполагаю, что таблицы будут настроены с помощью AUTO_INCREMENT
, поэтому значения id будут заботиться о себе.
Чтобы создать эти файлы в Excel, получите различные значения, используя Data > Remove Duplicates. Если у вас есть доступ к чему-то вроде файлов импорта phpMyAdmin в базу данных, затем импортируйте эти две таблицы.
Создание пользователей:
Чтобы получить внешние ключи в таблице users, я бы создал таблицу users с помощью:
имя, регионы, зона, region_id, zone_id
Вы можете импортировать исходный файл в имя, регионы, поля зон, а затем обновить внешние ключи.
UPDATE users as u SET region_id = (SELECT id FROM regions as r WHERE r.region_name = u.region)
Затем просто отбросьте регионы области и зоны.
Ответ 4
Во-первых, нам нужно вывести электронную таблицу в формате таблицы в MySQL, используя Export/Import feature
Экспортируйте таблицу так, как вы показываете ее в электронной таблице (с прописанными именами). Импортируйте это в MySQL - в таблицу, скажем, tempUsers
.
Выполните следующий запрос, чтобы выполнить нормализацию при создании нужной таблицы (с номерами вместо имен):
Что-то вроде этого:
INSERT INTO users
(id, name, region_id, zone_id)
SELECT tempUsers.id, tempUsers.name, region.id, zone.id
FROM X
LEFT JOIN region AS region ON region.region_name = tempUsers.region
LEFT JOIN zone AS zone ON zone.zone_name = tempUsers.zone;
Если id - AUTO_INCREMENT
, вы можете сделать это немного по-другому. (Оставьте id
вне INSERT и SELECT, потому что AUTO_INCREMENT
будет увеличивать количество строк на 1 каждый раз, когда вводится новая запись).
Счастливое программирование
Ответ 5
Обычно это то, что я делаю.
Создайте формулу excel для создания вставки script. Идентификатор будет автоматически генерироваться, поэтому просто пропустите его.
Предполагая, что ваш идентификатор находится в ячейке A, имя в B-ячейке, области и зоне в C и D соответственно.
="INSERT INTO USER_TABLE(NAME, REGION_ID, ZONE_ID) VALUES ('"&B1&"',(select id
from region where region_name = '"&C1&"'), (select id from zone where
zone_name = '"&D1&"')";
После создания 1 перетащите формулу до конечных строк, скопируйте script и выполните ее.
Что я считаю:
- Необходимо запланировать во многих средах, локальных, SIT, UAT, Production
может быть. Я не получил доступ к БД в производственную среду, поэтому лучше всего вставить script.
- Не задействовать так много вещей и легче изменить в случае следующего раза
необходимо добавить новый столбец.
Ответ 6
Для повторного требования внешние ключи могут отображаться в Excel.
Экспорт таблицы регионов и таблицы зон в файл Excel.
например (ex: имя_файла: lookupmaster.xlsx)
region name region Id
Polon 1
yerni 2
В электронной таблице с фактическими данными добавьте два столбца в качестве
region_id, zone_id
Получить идентификатор региона для всех строк с помощью vlookup
VLOOKUP(B2,[lookumaster.xlsx]Sheet1!$A$1:$B$4,2,FALSE)
Чтобы удалить зависимость от основного, ключевого столбца,
скопируйте область Id column и вставьте специальные значения только на свое место.
Повторите то же самое для идентификатора зоны
Вы можете удалить столбец области и зоны из электронной таблицы и импортировать ее в базу данных.