Импорт данных Excel в реляционные таблицы на MySQL - PullRequest
4 голосов
/ 08 февраля 2011

У меня есть три таблицы в моей базе данных MySQL.Первый - города, второй - города, а третий - районы.В каждом городе много районов.Детали моей таблицы:

города:

cityid, название города

города:

townid, cityid, имя города, континент

районы:

округ, townid, название района

У меня естьфайл Excel, содержащий названия городов и районов one city.Он имеет три столбца.

название города, название города, название района

название города на этом листе Excel всегда одинаково.Название города имеет дубликаты из-за его районов.Я имею в виду для каждого района города: название города и названия городов одинаковы, а названия районов, как обычно, разные.Например:

название города, название города, название района

XYA

XYB

XKC

XKD

Ответы [ 3 ]

8 голосов
/ 02 декабря 2012

Вы можете сохранить лист Excel как в CSV-файле , а затем импортировать такой файл во временную таблицу MySQL с теми же столбцами листа Excel, используя LOAD DATA INFILE и, наконец, разделить записи временных таблиц на три таблицы: «города», «города» и «районы».
Предпосылка: поскольку в файле Excel нет ни одного поля «id», я полагаю, что всеидентификаторы - это поля "auto_increment";Кроме того, поле «континент» таблицы «города» всегда будет иметь пустое значение, так как это поле отсутствует на вашем листе Excel;наконец, я предполагаю, что все поля имени имеют максимальную длину 255 символов.
Начиная с ваших образцов данных, экспортируя лист Excel в формате CSV и сохраняя (например) в "* 1007"Файл * 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"со следующим содержимым, и выполнить его :

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;
3 голосов
/ 08 февраля 2011

Грубый пример использования 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
0 голосов
/ 03 декабря 2012

Если ваши Район, Город или Город имена не в простом ASCII (с акцентированными символами), то вы можете захотеть сделать один или настроить @Enzino; возможно, просто добавив сноску к любым инструкциям пользователя, чтобы проинструктировать пользователя, что при сохранении листа в файл CSV ему необходимо будет выбрать в поле Сохранить как диалоговое окно : Инструменты- > Параметр Web Options , выберите вкладку Encoding в открывшемся диалоговом окне и установите набор символов, соответствующий настройке соответствующей таблицы mySQL: Unicode (UTF-8) перед сохранением.

В качестве альтернативы и в зависимости от того, кто выполняет импорт, следующий мой ответ может помочь им получить данные непосредственно в excel_table .

...