将Excel数据导入到MySQL中的关系表中

问题描述:

我在我的MySQL数据库中有三个表。第一个是城市,第二个是城镇,第三个是地区。每个城镇都有很多地区。我的表详细信息:将Excel数据导入到MySQL中的关系表中

城市:

cityid,城市名称

镇:

townid,cityid,townname,大陆

区:

districtid,townid,districtname

我有一个持有一个城市的城镇和地区名称的Excel文件。它有三列。

市,町名,地区名

城市的名字总是在这个excel表相同。镇名因其区而重复。我的意思是对于一个城镇的每个地区:城市名称和城镇名称相同,地区名称与往常不同。例如:

市,町名,地区名

X Y A

X Y B

X K C的

值X k d

+0

如果您在Excel中工作,ADO如何? – Fionnuala 2011-02-08 13:32:55

粗略使用MySQL与Excel和ADO的例子。合适的连接字符串可以从http://connectionstrings.com

Dim cn As New ADODB.Connection 
Dim sFile As String, scn As String, sSQL As String 
Dim MySQLConnectionString As String 

''It is probably better to use the name of the workbook 
''eg C:\Docs\Cities.xls 
sFile = ActiveWorkbook.FullName 

''Access 2003 or less 
scn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sFile _ 
    & ";Extended Properties=""Excel 8.0;HDR=Yes"";" 
cn.Open scn 

MySQLConnectionString = "ODBC;Driver={MySQL ODBC 5.1 Driver};Server=localhost;" _ 
& "Database=mydatabase;User=myuser;Password=mypass;Option=3;" 

''Fields (columns) are case sensitive 
''Insert cities from sheet1, you can also use a named range, 
''include or a range 
sSQL = "INSERT INTO [" & MySQLConnectionString & "].Cities (Id,City) " _ 
& "SELECT Id,City FROM [Sheet$] WHERE Id Not In " _ 
& "(SELECT Id FROM [" & MySQLConnectionString & "].Cities)" 

cn.Execute sSQL, dbFailOnError 

可以得到你可以save your Excel sheet as in a CSV file,然后在临时MySQL表使用LOAD DATA INFILE命令导入这样的文件,Excel工作表的相同列,终于在拆分临时表中的记录三个表格“城市”,“城镇”和“区域”。
前提:由于Excel文件中没有“id”字段,因此我想所有的id都是“auto_increment”字段;此外,“城镇”表中的“大陆”字段将始终设置为空白值,因为此字段不存在于Excel工作表中;最后,我假定所有“名称”字段的最大长度为255个字符。
从样本数据出发,通过CSV格式导出Excel工作表和保存(例如)进入“C:\ TEMP \ excel.csv”的文件,你应该得到这样的事情:

"city name","town name","district name" 
"X","Y","A" 
"X","Y","B" 
"X","K","C" 
"X","K","D" 

要将此文件导入到MySQL数据库中,请创建一个“excel2mysql。SQL“有以下内容的文件,并execute it

DROP TABLE IF EXISTS excel_table; 
CREATE temporary TABLE excel_table (
    city_name VARCHAR(255), 
    town_name VARCHAR(255), 
    district_name VARCHAR(255) 
) DEFAULT CHARSET utf8; 

LOAD DATA LOCAL INFILE 'C:/Temp/excel.csv' 
INTO TABLE excel_table 
CHARACTER SET utf8 
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"' 
LINES TERMINATED BY '\n' 
IGNORE 1 LINES; 

DROP TABLE IF EXISTS cities; 
CREATE TABLE cities (
    city_id int NOT NULL auto_increment, 
    city_name VARCHAR(255), 
    primary key (city_id) 
) DEFAULT CHARSET utf8; 

INSERT INTO cities 
    SELECT distinctrow NULL, city_name 
    FROM excel_table 
    ORDER BY city_name; 

DROP TABLE IF EXISTS towns; 
CREATE TABLE towns (
    town_id int NOT NULL auto_increment, 
    city_id int NOT NULL, 
    town_name VARCHAR(255), 
    continent VARCHAR(255), 
    primary key (town_id) 
) DEFAULT CHARSET utf8; 

INSERT INTO towns 
    SELECT distinctrow NULL, city_id, town_name, '' 
    FROM excel_table, cities 
    WHERE cities.city_name=excel_table.city_name 
    ORDER BY town_name; 

DROP TABLE IF EXISTS districts; 
CREATE TABLE districts (
    district_id int NOT NULL auto_increment, 
    town_id int NOT NULL, 
    district_name VARCHAR(255), 
    primary key (district_id) 
) DEFAULT CHARSET utf8; 

INSERT INTO districts 
    SELECT distinctrow NULL, town_id, district_name 
    FROM excel_table, towns 
    WHERE towns.town_name=excel_table.town_name 
    ORDER BY district_name; 

如果您区,镇名称不以纯ASCII(已重音字符),那么你可能要做出一个或者调整为@Enzino解决方案;可能只是向任何用户指令添加脚注,以指示用户在将表单保存为CSV文件时,需要在另存为对话框框中选择:工具 - > Web选项选项,选择编码选项卡,在出现的对话框中设置字符集以匹配对应的mySQL表的字符集:保存前的Unicode(UTF-8)

或者,根据谁在哪里输入,我的以下answer可能会帮助他们将数据直接输入到excel_table