2017-07-17 30 views
0

我找到了一個正確的解決方案,它可以在MySQL中使用Load Data Infile如何使用重複鍵更新。下面是我使用的代碼(從堆棧溢出得到它):MySQL:使用AI主鍵和重複鍵更新加載數據文件

CREATE TEMPORARY TABLE temporary_table LIKE employee_table; 

SHOW INDEX FROM temporary_table; 
DROP INDEX `PRIMARY` ON temporary_table; 

LOAD DATA INFILE 'csv/employee_table' 
INTO TABLE temporary_table FIELDS TERMINATED BY ',' LINES TERMINATED BY '\r\n' 
(
    `AutoID`, `Name`, `Age`, `Salary` 
) 

SHOW COLUMNS FROM employee_table; 
INSERT INTO employee_table 
SELECT * FROM temporary_table 
ON DUPLICATE KEY UPDATE AutoID = Values(AutoID); 

DROP TEMPORARY TABLE temporary_table; 

上面這段代碼工作正常更新與只具有不同ID的新記錄的表。但是,當PRIMARY鍵是自動增量(AI)時,它無法工作。它表明下面的代碼不能在自動遞增PRIMARY鍵上運行。

DROP INDEX `PRIMARY` ON temporary_table 

以下是錯誤消息:

#1075 - Incorrect table definition; there can be only one auto column and it must be defined as a key 

我很困惑,因爲如果我不使用自動增量,它完美地運行。任何人都知道如何解決這個問題?提前致謝。

回答

0

有兩個程序。

1)您的問題解決方案。

mysql> DROP INDEX `PRIMARY` ON test5; 
ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key 
mysql> show create table test5; 
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
| Table | Create Table                                                        | 
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
| test5 | CREATE TEMPORARY TABLE `test5` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(50) NOT NULL, 
    `address` varchar(100) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `name` (`name`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 | 
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
1 row in set (0.00 sec) 

mysql> alter table test5 modify `id` int(11) NOT NULL; 
Query OK, 0 rows affected (0.21 sec) 
Records: 0 Duplicates: 0 Warnings: 0 

mysql> 
mysql> DROP INDEX `PRIMARY` ON test5; 
Query OK, 0 rows affected (0.02 sec) 
Records: 0 Duplicates: 0 Warnings: 0 

mysql> 
mysql> show create table test5; 
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
| Table | Create Table                                              | 
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
| test5 | CREATE TEMPORARY TABLE `test5` (
    `id` int(11) NOT NULL, 
    `name` varchar(50) NOT NULL, 
    `address` varchar(100) DEFAULT NULL, 
    UNIQUE KEY `name` (`name`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 | 
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
1 row in set (0.00 sec) 

2)最好的解決方案..

我們可以更換第一(兩步)下面在步驟單個查詢。

1)和2)我們可以創建具有相同參考結構且沒有任何索引的新表格。

CREATE TEMPORARY TABLE temporary_table SELECT * FROM target_table WHERE 1=0; 

而不是..

1)創建一個新的臨時表。

CREATE TEMPORARY TABLE temporary_table LIKE target_table; 

2)(可選)刪除臨時表中的所有索引以加快速度。

SHOW INDEX FROM temporary_table; DROP INDEX PRIMARY ON temporary_table; DROP INDEX some_other_index ON temporary_table; 

你也可以參考下面的鏈接。

MySQL LOAD DATA INFILE with ON DUPLICATE KEY UPDATE