2016-07-14 219 views
0

我想從csv文件導入一些記錄到mysql表。在我的表中,我有一個字段id,它會自動增加。當我使用MySQL命令行中的以下命令導入數據時,字段ID會錯誤地增加:如果在我的數據庫中,最後一個ID是3 - >插入的第一條記錄具有ID 5.爲什麼它會跳過一個?從CSV文件導入到mysql數據庫錯誤

LOAD DATA LOCAL INFILE 'db.csv' INTO TABLE product 
    FIELDS TERMINATED BY ',' 
    LINES TERMINATED BY '\r\n' 
    IGNORE 1 LINES 
    (code, description, name, price, stockLevel); 

db.csv文件:

enter image description here

我不從CSV插入這個ID字段(代碼是另一回事)。

+0

我的猜測是mysql保留了一個內部計數器。 – Marichyasana

+0

我該怎麼辦? – DianaM

+0

什麼是在你的自動遞增ID有一個「差距」的問題?此功能的目的正是爲了保持您的記錄的唯一性。 – mitkosoft

回答

-1

ALTER TABLE table_name AUTO_INCREMENT = 1;

+0

它不能正常工作 – DianaM

0

我的猜測是你之前添加了一行並刪除了它,所以id被保留了。

你可以迫使它在特定點例如:內徑3與自動增量命令

ALTER TABLE product AUTO_INCREMENT = 4; 

開始然後你可以運行CSV導入。

我複製了你的表並運行你的代碼,沒有任何數字跳過。

+0

我放了幾次表並重新創建它,第一次運行「加載數據..」命令它可以正常工作,但是如果我立即再次運行它,則會嚴重增加(跳過一個ID) 。 – DianaM

+0

您是否運行過我發佈的ALTER命令?你是否多次運行LOAD DATA命令?你的csv文件中有沒有不必要的ctrl lf? (儘管這會在表格中創建一個可見的行)。你也可以嘗試使用NOT NULL這樣的constaints來拋出錯誤。 –

+0

如果你的數據大小不是很大,並且沒有與id相關的記錄,那麼你可以簡單地將所有csv文件加載到你的表中,然後刪除id並重新創建它,這將按順序設置你的所有id。例如'ALTER TABLE'product' DROP'id'; ALTER TABLE'product' ADD'id' INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;'[dev.mysql.com comment by Luke Up](http://dev.mysql.com/doc/refman/5.7/en/example-自動increment.html) –

0

您可能最後在文件中有空行。您需要重新創建表。

show create table [YOUR TABLE]; 

CREATE TABLE TEST.TEMP[YOUR TABLE] SELECT * FROM [YOUR TABLE]; 
DROP TABLE [YOUR TABLE]; 
CREATE TABLE [YOUR TABLE] 
--- 
--- 
--- 

INSERT INTO [YOUR TABLE] SELECT 0 , code, description, name, price, stockLevel FROM TEST.TEMP[YOUR TABLE]; 

希望這會有所幫助。

0

看來,用戶grandepivko是正確的。

將AUTO_INCREMENT設置回1(或至少努力)將下一個AI設置爲正確的值。

於是,外賣是的LOAD DATA INFILE後設置AUTO_INCREMENT回到1

ALTER TABLE product AUTO_INCREMENT=1; 

drop table if exists product; 
create table product 
(
    id int auto_increment primary key, 
    code int not null, 
    description varchar(100) not null, 
    name varchar(100) not null, 
    price decimal(10,2) not null, 
    stockLevel int not null 
); 

LOAD DATA LOCAL INFILE 'c:\\nate\\load_drinks01.txt' INTO TABLE product 
    FIELDS TERMINATED BY ',' 
    LINES TERMINATED BY '\r\n' 
    IGNORE 1 LINES 
    (code, description, name, price, stockLevel); 

select * from product; -- has products 1,2,3 for AUTO_INC id 

select `AUTO_INCREMENT` 
from INFORMATION_SCHEMA.TABLES 
where TABLE_SCHEMA = 'so_gibberish' -- database name 
and TABLE_NAME = 'product'; -- table name 
-- value is now 5 

ALTER TABLE product AUTO_INCREMENT=1; 

select `AUTO_INCREMENT` 
from INFORMATION_SCHEMA.TABLES 
where TABLE_SCHEMA = 'so_gibberish' -- database name 
and TABLE_NAME = 'product'; -- table name 
-- value is now 4 

LOAD DATA LOCAL INFILE 'c:\\nate\\load_drinks01.txt' INTO TABLE product 
    FIELDS TERMINATED BY ',' 
    LINES TERMINATED BY '\r\n' 
    IGNORE 1 LINES 
    (code, description, name, price, stockLevel); 

select * from product; -- has products 1,2,3,4,5,6 for AUTO_INC id 

SELECT `AUTO_INCREMENT` 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_SCHEMA = 'so_gibberish' -- database name 
AND TABLE_NAME = 'product'; -- table name 
-- value is now 8 

ALTER TABLE product AUTO_INCREMENT=1; 
SELECT `AUTO_INCREMENT` 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_SCHEMA = 'so_gibberish' -- database name 
AND TABLE_NAME = 'product'; -- table name 
-- value is now 7 

從以下Bug Report,一個片段:

[2013年3月12日23點五十○]唐輝順便說一下,有另一種解決方法是 ALTER TABLE AUTO_INCREMENT COUNTER爲1,所以它復位最大 多項紀錄:

ALTER TABLE表AUTO_INCREMENT = 1

該表的AUTO_INCREMENT重置後PRIMARY KEY的MAX + 1值