我有一张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电子表格导入到用户表。
答案 0 :(得分:11)
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.name
LEFT JOIN zone AS z ON z.zone_name = X.name;
如果id
是AUTO_INCREMENT
,那么您可能希望以稍微不同的方式执行此操作。 (将id
退出INSERT
和SELECT
。)
我使用了LEFT
,以防有一些丢失的区域或划分区域。在这种情况下,您将获得NULLs
或region_id
的{{1}}或默认值,从而表明某些内容需要修复。
答案 1 :(得分:3)
我建议在.xls表中,将区域和区域名称替换为数据库中这些字段的实际ID。然后,您可以将xls文件导出到csv文件中,然后使用mysqlimport轻松将其导入数据库
mysqlimport --ignore-lines=1 \
--fields-terminated-by=, \
--local -u root \
-p DatabaseName \
YourExportedFile.csv
这里要考虑的一些事情:
您可以使用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后,将公式向下拖动到结束行,复制脚本并执行它。
我考虑的事情:
答案 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
重复相同的操作您可以从电子表格中删除区域和区域列,然后将其导入数据库。