2016-07-14 109 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值