2016-02-23 2 views
0

У меня есть две таблицы:НАГРУЗКИ INFILE DATA для загрузки данных в разных таблицах

Company(id int, varchar(name), primary key(id)); 
Product (id int, c_id int, varchar(name), foreign key(c_id), references Company(id)); 

магазинов Таблица «Компания» список названий компаний и магазинов «продукта» список названий продуктов, и одна компания может иметь несколько продуктов.

Если у меня есть файл данных, как это, табуляцией:

1 Apple iPhone 
2 Apple iPad 
3 Apple iMac 
4 Google Gmail 
5 Google Google Search 
6 Amazon Kindle 

Можно ли использовать «INFILE LOAD DATA», чтобы загрузить этот файл в две таблицы, где первый столбец идет в таблице компаний и второй coloumn переходит к продукту? Вопрос заключается в том, как загружать выбранные поля в определенную таблицу, а не загружать полную запись в одну таблицу.

+0

ли эти новые таблицы или же они уже существуют? Как насчет полей 'id' в этих таблицах? У вас нет данных для обоих идентификаторов. –

+0

Две таблицы уже существуют. Я могу удалить идентификатор из файла, если он упрощает загрузку, но каждая таблица имеет «id» в качестве первичного ключа. – ling

+0

'LOAD DATA' имеет возможность выборочно загружать только определенные столбцы, но порядок, как представляется, продиктован CSV-файлом. Поэтому я не уверен, что есть способ сделать то, что вы хотите. –

ответ

1

Я не считаю, что LOAD DATA достаточно гибкий, чтобы вы могли выборочно загружать определенные столбцы в две разные уже существующие таблицы. Он был спроектирован как быстрая рабочая лошадь, но не был разработан, чтобы быть особенно гибким. Альтернативой было бы загрузить ваши данные во временную таблицу, а затем INSERT INTO...SELECT данные в ваши две таблицы.

CREATE TABLE temp(id int, company varchar(55), product varchar(55)); 

LOAD DATA LOCAL INFILE 'file.csv' INTO TABLE temp 
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"' 
LINES TERMINATED BY '\r\n' 
IGNORE 1 LINES 
(id, company, product); 

А затем просто использовать INSERT INTO...SELECT, чтобы получить данные в ваших двух таблиц, которые уже существуют:

INSERT INTO Company (name) 
SELECT company 
FROM temp 

INSERT INTO Product (name) 
SELECT product 
FROM temp 
+0

Эта проблема заключается в том, что в продукте также необходимо вставить поле «c_id», а также «имя», которое создает отношения между компанией и продуктом. См. Определения таблиц. – ling

+0

Откуда находится 'c_id', входящий в ваш входной файл csv? Мне это было непонятно. –

+0

c_id не находится в файле csv. Так что, наверное, лучше разбить файл csv на два, чтобы облегчить жизнь. – ling

0

Вы можете попробовать такой подход, как это, с предпосылкой использования временной таблицы. Надеюсь, вы сочтете это полезным.

/path/to/file/file.csv

1,Apple,iPhone 
2,Apple,iPad 
3,Apple,iMac 
4,Google,Gmail 
5,Google,Google Search 
6,Amazon,Kindle 
mysql> DELIMITER // 

mysql> DROP TRIGGER IF EXISTS `from_load_data`// 
Query OK, 0 rows affected, 1 warning (0.00 sec) 

mysql> DROP TABLE IF EXISTS `temp_company_product`// 
Query OK, 0 rows affected, 1 warning (0.00 sec) 

mysql> DROP TABLE IF EXISTS `product`// 
Query OK, 0 rows affected, 1 warning (0.00 sec) 

mysql> DROP TABLE IF EXISTS `company`// 
Query OK, 0 rows affected, 1 warning (0.00 sec) 

mysql> CREATE TABLE `company` (
    ->  `id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
    ->  `name` VARCHAR(25), 
    ->  UNIQUE KEY `unique_name` (`name`) 
    ->)// 
Query OK, 0 rows affected (0.00 sec) 

mysql> CREATE TABLE `product` (
    ->  `id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
    ->  `c_id` INT UNSIGNED NOT NULL, 
    ->  `name` VARCHAR(25), 
    ->  FOREIGN KEY (`c_id`) REFERENCES `company`(`id`) 
    ->   ON UPDATE CASCADE ON DELETE CASCADE 
    ->)// 
Query OK, 0 rows affected (0.00 sec) 

mysql> CREATE TABLE `temp_company_product` (
    ->  `id` INT UNSIGNED PRIMARY KEY, 
    ->  `company_name` VARCHAR(25), 
    ->  `product_name` VARCHAR(25) 
    ->)// 
Query OK, 0 rows affected (0.00 sec) 

mysql> CREATE TRIGGER `from_load_data` AFTER INSERT ON `temp_company_product` 
    -> FOR EACH ROW 
    -> BEGIN 
    ->  INSERT INTO `company` (`name`) VALUES (NEW.`company_name`) 
    ->   ON DUPLICATE KEY UPDATE `name` = VALUES(`name`); 
    ->  INSERT INTO `product` (`c_id`, `name`) 
    ->  SELECT `id`, NEW.`product_name` 
    ->  FROM `company` 
    ->  WHERE `name` = NEW.`company_name`; 
    -> END// 
Query OK, 0 rows affected (0.00 sec) 

mysql> LOAD DATA INFILE '/path/to/file/file.csv' 
    ->  INTO TABLE `temp_company_product` 
    -> FIELDS TERMINATED BY ',' ENCLOSED BY '"' 
    -> LINES TERMINATED BY '\r\n' 
    -> (`id`, `company_name`, `product_name`)// 
Query OK, 6 rows affected (0.00 sec) 
Records: 6 Deleted: 0 Skipped: 0 Warnings: 0 

mysql> SELECT 
    ->  `id`, 
    ->  `company_name`, 
    ->  `product_name` 
    -> FROM 
    ->  `temp_company_product`// 
+----+--------------+---------------+ 
| id | company_name | product_name | 
+----+--------------+---------------+ 
| 1 | Apple  | iPhone  | 
| 2 | Apple  | iPad   | 
| 3 | Apple  | iMac   | 
| 4 | Google  | Gmail   | 
| 5 | Google  | Google Search | 
| 6 | Amazon  | Kindle  | 
+----+--------------+---------------+ 
6 rows in set (0.00 sec) 

mysql> SELECT 
    ->  `id`, 
    ->  `name` 
    -> FROM 
    ->  `company`// 
+----+--------+ 
| id | name | 
+----+--------+ 
| 6 | Amazon | 
| 1 | Apple | 
| 4 | Google | 
+----+--------+ 
3 rows in set (0.00 sec) 

mysql> SELECT 
    ->  `id`, 
    ->  `c_id`, 
    ->  `name` 
    -> FROM 
    ->  `product`// 
+----+------+---------------+ 
| id | c_id | name   | 
+----+------+---------------+ 
| 1 | 1 | iPhone  | 
| 2 | 1 | iPad   | 
| 3 | 1 | iMac   | 
| 4 | 4 | Gmail   | 
| 5 | 4 | Google Search | 
| 6 | 6 | Kindle  | 
+----+------+---------------+ 
6 rows in set (0.00 sec) 

mysql> DROP TRIGGER IF EXISTS `from_load_data`// 
Query OK, 0 rows affected (0.00 sec) 

mysql> DROP TABLE IF EXISTS `temp_company_product`// 
Query OK, 0 rows affected (0.00 sec) 

mysql> DELIMITER ;