Php 如何使用外键将.xls文件导入.sql
我有一个excel电子表格: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
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文件,然后使用
这里需要考虑的一些事情:
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后,将公式向下拖动到结束行,复制脚本并执行它
我认为:
对于重复的要求,可以在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,那么使用新列和更新应该很容易。