如何使用外键将.xls文件导入到.sql
我有一个Excel电子表格:
id name region zone 1 pokin Polon Riny 2 lucy yerni kinta ...
而我有MySQL数据库中的表,而不是区域和区域ID的外键,而不是区域标识和区域标识。
用户表:
id name region_id zone_id 1 retre 1 1 ...
地区表:
id region_name 1 Polon ...
和区表
id zone_name 1 kinta ...
我需要将Excel电子表格导入到用户表中。
- 在电子表格中显示表格时输出表格(用拼写的名称)。
- 导入到MySQL – 到表
X
,说。 - 执行以下查询,在创build所需表格时(使用数字而不是名称)执行“标准化”:
像这样的东西:
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.name LEFT JOIN zone AS z ON z.zone_name = X.name;
如果id
是一个AUTO_INCREMENT
,那么你可能想稍微改变一下。 (将id
从INSERT
和SELECT
留出)
如果有一些缺失的地区或分区,我使用了LEFT
。 在这种情况下,您将获得region_id
或zone_id
NULLs
或默认值,从而指示需要修复的东西。
我build议在你的.xls表中,用这些字段的实际的数据库id来replace区域和区域名称。 然后你可以将你的xls文件导出到csv文件中,然后使用mysqlimport轻松地将它导入到你的数据库中
mysqlimport --ignore-lines=1 \ --fields-terminated-by=, \ --local -u root \ -p DatabaseName \ YourExportedFile.csv
这里需要考虑一些事情:
- 执行命令时文件的path。
- 字符结尾的字符
- “-p DatabaseName”,DatabaseName不是密码,是你的数据库名称,执行命令时会提示你input密码。
您可以使用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;
此外,如果您使用任何graphicsMySQL客户端(mysql工作台,heideSql,mysqlpro等),您可以使用导入function。
假设这些表都不存在,首先创build三个CSV文件users.csv,regions.csv,zone.csv。
regions.csv和zones.csv将只有一列,您可以将其导入数据库中的是region_name或zone_name。 我假设表将使用AUTO_INCREMENT
设置,所以ID值将自己照顾。
要在Excel中创build这些文件,请使用“数据”>“删除重复”来获取不同的值。 如果您有权访问phpMyAdmin等文件导入到数据库,然后导入这两个表。
创build用户:为了获得外键到用户表中,我将创build用户表:
名称,地区,区域,region_id,zone_id
您可以将原始文件导入名称,区域,区域字段,然后更新外键。
UPDATE users as u SET region_id = (SELECT id FROM regions as r WHERE r.region_name = u.region)
然后放下区域和区域列。
First we need to bring the spreadsheet in the table format in MySQL by using Export/Import feature Export the table as you show it in the spreadsheet (with spelled out names). Import that into MySQL - into table tempUsers, say. Perform the following query to do the "normalization" as you create the desired table (with numbers instead of names):
像这样的东西:
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区域AS区域ON区域.zone_name = tempUsers.zone;
如果id是一个AUTO_INCREMENT,那么你可能想稍微改变一下。 (将ID从INSERT和SELECT中留出,因为每当新logging进入时,Auto_Increment将使行数增加1)
快乐的编程
通常这是我做的。
创buildExcel公式来生成插入脚本。 ID将是一个自动生成,所以只是跳过它。 假设你的ID在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&"')";
创build后,拖动公式到最后的行,复制脚本并执行它。
我考虑的事情:
- 需要在很多环境中打补丁,可能是Local,SIT,UAT,Production。 我没有数据库访问生产环境,所以插入脚本是最好的方法。
- 不涉及太多的东西,更容易改变,以防下次需要添加新列。
对于重复的需求,可以在Excel中映射外键。 将区域表和区域表导出到Excel文件。 像(例如:文件名: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列,并将其作为值仅粘贴到其位置。
对区域ID重复相同的操作
您可以从电子表格中删除区域和区域列,并将其导入数据库。