在Excel中将Excel数据导入到关系表
我有三个表在我的MySQL数据库。 第一个是城市,第二个是城镇,第三个是地区。 每个镇都有很多地区。 我的桌子细节:
城市:
cityid,城市名称
城市:
城镇,cityid,城镇名称,大陆
区:
城镇,区名
我有一个excel文件,包含一个城市的城镇和地区名称。 它有三列。
城市名称,城镇名称,地区名称
这个excel表单中的城市名称总是一样的。 镇名因其区而重复。 我指的是一个城镇的每个地区:城市名称和城镇名称是相同的,地区名称与往常不同。 例如:
城市名称,城镇名称,地区名称
XYA
XYB
XKC
XKD
您可以将您的Excel工作表保存为CSV文件 ,然后使用LOAD DATA INFILE命令将这样的文件导入到临时MySQL表格中,并将其与Excel工作表的相同列进行导入,最后将临时表logging拆分为三个表格“城市“,”城镇“和”地区“。
前提是:因为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数据库,用下面的内容创build一个“ excel2mysql.sql ”文件,并执行它 :
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;
使用Excel和ADO的MySQL的一个粗略的例子。 合适的连接string可以从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
如果你的地区,城镇或城市名称不是纯ASCII(有重音字符),那么你可能想要做一个或者调整到@Enzino解决scheme; 可能只是给任何用户指令添加一个脚注,以指示用户在将工作表保存为CSV文件时,需要在另存为对话框中select: 工具 – > Web选项选项,select编码选项卡,在出现的对话框中设置字符集,使其与匹配的mySQL表的字符集保持一致: Unicode(UTF-8) 。
或者,根据谁在import,那么我的下面的答案可能会帮助他们将数据直接进入excel_table 。