Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使用外键将.xls文件导入.sql_Php_Mysql_Sql_Excel - Fatal编程技术网

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

Php 如何使用外键将.xls文件导入.sql,php,mysql,sql,excel,Php,Mysql,Sql,Excel,我有一个excel电子表格: id name region zone 1 pokin Polon Riny 2 lucy yerni kinta ... 我在mysql数据库中有一些表,它们有region\u id和zone\u id,它们是region和zone中id的外键 用户表: id name region_id zone_id 1 retre 1 1 ... id region_name 1 Polon ... 地区表: id name

我有一个excel电子表格:

id name  region  zone  
1  pokin Polon   Riny
2  lucy  yerni   kinta
...
我在mysql数据库中有一些表,它们有
region\u id
zone\u id
,它们是region和zone中id的外键

用户表:

id name region_id zone_id
1  retre  1        1
...
id region_name
1   Polon
...
地区表:

id name region_id zone_id
1  retre  1        1
...
id region_name
1   Polon
...
区域表

id zone_name
1   kinta
...

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

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

这里需要考虑的一些事情:

  • 执行命令时文件的路径
  • 封地以字符结尾
  • “-p DatabaseName”,DatabaseName不是密码,是您的数据库名,执行命令时会提示密码
  • 您可以使用SQL语句导入CSV文件

    此外,如果您正在使用任何图形化MySQL客户端(MySQL工作台、heideSql、mysqlpro等),则可以使用导入功能

  • 在电子表格中显示表格时导出表格(带有拼写的名称)
  • 将其导入MySQL,比如导入表
    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;
    
    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
    选择中退出)


    我使用了
    LEFT
    ,以防缺少一些区域或分区。在这种情况下,您将获得
    null
    region\u id
    zone\u id
    的默认值,从而表明需要修复某些问题。

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

    regions.csv和zones.csv将有一个单独的列,您可以将该列导入数据库,即region\u name或zone\u name。我假设将使用
    AUTO_INCREMENT
    设置这些表,因此id值将自行处理

    要在Excel中创建这些文件,请使用“数据>删除重复项”获取不同的值。如果您有权将phpMyAdmin文件导入数据库,则导入这两个表

    创建用户: 为了将外键放入users表,我将使用以下内容创建users表:

    名称、区域、区域、区域id、区域id

    可以将原始文件导入“名称”、“区域”和“区域”字段,然后更新外键

    UPDATE users as u SET region_id = (SELECT id FROM regions as r WHERE r.region_name = u.region) 
    
    然后只需删除区域和分区列

    首先,我们需要使用导出/导入功能将表格格式的电子表格带到MySQL中

    在电子表格中显示表格时导出表格(带有拼写的名称)。 将其导入MySQL-导入表,比如说
    tempUsers

    在创建所需的表(使用数字而不是名称)时,执行以下查询以执行规范化

    大概是这样的:

    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;
    
    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为“自动增量”
    ,则您可能希望以稍微不同的方式执行此操作。(将
    id
    保留在插入和选择之外,因为每当新记录输入时,
    AUTO_INCREMENT
    会将行数增加1)


    快乐编程

    通常我就是这么做的

    创建excel公式以生成插入脚本。Id将是自动生成的,所以跳过它。 假设您的id在一个单元格中,名称在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&"')";
    
    创建1后,将公式向下拖动到结束行,复制脚本并执行它

    我认为:

  • 需要在许多环境、本地、SIT、UAT、生产中进行修补 大概我没有数据库访问生产环境,所以插入脚本是最好的方法
  • 不涉及太多事情,更容易更改,以备下次使用 需要添加新列

  • 对于重复的要求,可以在Excel中映射外键。 将区域表和区域表导出到Excel文件。 like(例如:文件名:lookupmaster.xlsx)

    在包含实际数据的电子表格中,添加两列,如下所示:

    region_id, zone_id
    
    使用vlookup获取所有行的区域Id

    VLOOKUP(B2,[lookumaster.xlsx]Sheet1!$A$1:$B$4,2,FALSE)
    
    要删除对主、键列的依赖关系, 复制区域Id列,并仅在其位置粘贴特殊值

    对区域Id重复相同的操作


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

    我在表中有5000多条记录。用id替换区域和区域名称非常繁琐。@Steve--大约需要4条SQL语句,无循环,无需手动操作:
    CREATE TABLE mapping。。。选择DISTINCT zone…
    然后添加一个id列,
    在上更新实际连接映射。。。设置real.id=mapping.id,其中real.zone=mapping.zone
    。然后
    放置列区域
    。如果您愿意,我们可以讨论如何处理后续的
    加载。如果您将映射表和id映射列设置为stone,那么使用新列和更新应该很容易。