繁体   English   中英

如何使用外键将.xls文件导入.sql

[英]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_idzone_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. 在电子表格中显示时导出表格(带有拼写的名称)。
  2. 将其导入MySQL - 比如表X
  3. 在创建所需表时执行以下查询以执行“规范化”(使用数字而不是名称):

像这样的东西:

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;

如果idAUTO_INCREMENT ,那么您可能希望以稍微不同的方式执行此操作。 (将id保留在INSERTSELECT 。)

我使用LEFT以防有一些缺失区域或划分区域。 在这种情况下,您将获得region_idzone_id NULLs或默认值,从而指示需要修复的内容。

我建议在.xls工作表中,将区域和区域名称替换为数据库中这些字段的实际ID。 然后,您可以将xls文件导出到csv文件中,然后使用mysqlimport轻松将其导入数据库

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

这里要考虑的一些事情:

  1. 执行命令时文件的路径。
  2. fiels-terminate-by字符
  3. “-p DatabaseName”,DatabaseName不是密码,是您的数据库名称,执行命令时会提示输入密码。

您可以使用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后,将公式拖动到结束行,复制脚本并执行它。

我考虑的事情:

  1. 需要在很多环境中修补,本地,SIT,UAT,生产可能。 我没有DB访问生产环境,所以插入脚本是最好的方法。
  2. 不需要这么多东西,并且在下次需要添加新列时更容易更改。

对于重复的要求,可以在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM