如何使用外键将.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电子表格导入到用户表中。

  1. 在电子表格中显示表格时输出表格(用拼写的名称)。
  2. 导入到MySQL – 到表X ,说。
  3. 执行以下查询,在创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 ,那么你可能想稍微改变一下。 (将idINSERTSELECT留出)

如果有一些缺失的地区或分区,我使用了LEFT 。 在这种情况下,您将获得region_idzone_id NULLs或默认值,从而指示需要修复的东西。

我build议在你的.xls表中,用这些字段的实际的数据库id来replace区域和区域名称。 然后你可以将你的xls文件导出到csv文件中,然后使用mysqlimport轻松地将它导入到你的数据库中

 mysqlimport --ignore-lines=1 \ --fields-terminated-by=, \ --local -u root \ -p DatabaseName \ YourExportedFile.csv 

这里需要考虑一些事情:

  1. 执行命令时文件的path。
  2. 字符结尾的字符
  3. “-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后,拖动公式到最后的行,复制脚本并执行它。

我考虑的事情:

  1. 需要在很多环境中打补丁,可能是Local,SIT,UAT,Production。 我没有数据库访问生产环境,所以插入脚本是最好的方法。
  2. 不涉及太多的东西,更容易改变,以防下次需要添加新列。

对于重复的需求,可以在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重复相同的操作

您可以从电子表格中删除区域和区域列,并将其导入数据库。