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

时间:2017-05-22 07:19:22

标签: php mysql sql excel

我有一张Excel电子表格:

EPSFitPage

我在mysql数据库中有表id name region zone 1 pokin Polon Riny 2 lucy yerni kinta ... region_id,而不是区域和区域中id的外键。

用户表:

zone_id

区域表:

id name region_id zone_id
1  retre  1        1
...

区域表

id region_name
1   Polon
...

我需要将Excel电子表格导入到用户表。

6 个答案:

答案 0 :(得分:11)

  1. 在电子表格中显示时导出表格(带有拼写的名称)。
  2. 将其导入MySQL - 表格X,比方说。
  3. 执行以下查询以在创建所需表时执行“规范化”(使用数字而不是名称):
  4. 这样的事情:

    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;
    

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

    我使用了LEFT,以防有一些丢失的区域或划分区域。在这种情况下,您将获得NULLsregion_id的{​​{1}}或默认值,从而表明某些内容需要修复。

答案 1 :(得分:3)

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

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

这里要考虑的一些事情:

  1. 执行命令时文件的路径。
  2. fiels-terminate-by character
  3. " -p DatabaseName",DatabaseName不是密码,是您的数据库名称,执行命令时会提示输入密码。
  4. 您可以使用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等),您可以使用导入功能。

答案 2 :(得分:2)

假设这些表都不存在,首先创建三个CSV文件users.csv,regions.csv,zone.csv。

regions.csv和zones.csv将有一个可以导入数据库的列是region_name或zone_name。我假设表格将设置为AUTO_INCREMENT,因此id值将自行处理。

要在Excel中创建这些文件,请使用Data>获取不同的值。删除重复项。如果您可以访问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) 

然后删除区域和区域列。

答案 3 :(得分:1)

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用户         (id,name,region_id,zone_id)     SELECT tempUsers.id,tempUsers.name,region.id,zone.id         来自X.         LEFT JOIN区域AS区域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将使rowcount增加1)

快乐编程

答案 4 :(得分: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. 不涉及太多事情,下次更容易改变 需要添加新列。

答案 5 :(得分: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列的依赖, 复制区域Id列并将其粘贴为仅限

对区域ID

重复相同的操作

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