[英]How to import .xls file to .sql with a foreign key
我有一个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表中。
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
以防有一些缺失区域或划分区域。 在这种情况下,您将获得region_id
或zone_id
NULLs
或默认值,从而指示需要修复的内容。
我建议在.xls工作表中,将区域和区域名称替换为数据库中这些字段的实际ID。 然后,您可以将xls文件导出到csv文件中,然后使用mysqlimport轻松将其导入数据库
mysqlimport --ignore-lines=1 \
--fields-terminated-by=, \
--local -u root \
-p DatabaseName \
YourExportedFile.csv
这里要考虑的一些事情:
您可以使用LOAD DATA INFILE导入带有SQL语句的CSV文件
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等),您可以使用导入功能。
假设这些表都不存在,首先创建三个CSV文件users.csv,regions.csv,zone.csv。
regions.csv和zones.csv将有一个列,您可以将其导入到DB中的region_name或zone_name。 我假设将使用AUTO_INCREMENT
设置表格,因此id值将自行处理。
要在Excel中创建这些文件,请使用“数据”>“删除重复项”获取不同的值。 如果您可以访问phpMyAdmin等文件导入文件到数据库,则导入这两个表。
创建用户:为了将外键放入users表,我将使用以下命令创建users表:
name,regions,zone,region_id,zone_id
您可以将原始文件导入名称,区域,区域字段,然后更新外键。
UPDATE users as u SET region_id = (SELECT id FROM regions as r WHERE r.region_name = u.region)
然后删除区域和区域列。
首先,我们需要使用
Export/Import feature
将表格格式的电子表格放在MySQL中
在电子表格中显示时导出表格(带有拼写的名称)。 将它导入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)。
快乐的编程
通常这就是我的意思。
创建excel公式以生成插入脚本。 Id将是一个自动生成,所以只需跳过它。 假设您的id在A单元格中,请分别在B单元格中指定区域和区域。
="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后,将公式拖动到结束行,复制脚本并执行它。
我考虑的事情:
对于重复的要求,可以在Excel中映射外键。 将区域表和区域表导出到Excel文件。 喜欢(例如:filename:lookupmaster.xlsx)
region name region Id
Polon 1
yerni 2
在包含实际数据的电子表格中,添加两列作为
region_id, zone_id
使用vlookup获取所有行的区域ID
VLOOKUP(B2,[lookumaster.xlsx]Sheet1!$A$1:$B$4,2,FALSE)
要删除对master,key列,copy region Id列的依赖性,并仅在其位置粘贴special作为值 。
对区域ID重复相同的操作
您可以从电子表格中删除区域和区域列,并将其导入数据库。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.