从CSV文件导入mysql数据库错误

从CSV文件导入mysql数据库错误,mysql,csv,command-line,insert,auto-increment,Mysql,Csv,Command Line,Insert,Auto Increment,我正在尝试将一些记录从csv文件导入mysql表。在我的表中,我有一个自动递增的字段id。当我使用以下命令从MySQL命令行导入数据时,字段id错误地增加:如果在我的数据库中,最后一个id是3->它插入的第一条记录的id是5。为什么跳过一个 LOAD DATA LOCAL INFILE 'db.csv' INTO TABLE product FIELDS TERMINATED BY ',' LINES TERMINATED BY '\r\n' IGNORE 1 LINES (co

我正在尝试将一些记录从csv文件导入mysql表。在我的表中,我有一个自动递增的字段id。当我使用以下命令从MySQL命令行导入数据时,字段id错误地增加:如果在我的数据库中,最后一个id是3->它插入的第一条记录的id是5。为什么跳过一个

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文件:


我不会从csv中插入此id字段(代码是其他内容)。

更改表格\u name AUTO\u INCREMENT=1

我猜您之前添加了一行并删除了它,因此id被保留

您可以使用autoincrement命令强制它在特定点(例如id 3)启动

ALTER TABLE product AUTO_INCREMENT = 4;
然后可以运行csv导入


我复制了你的表并运行了你的代码,没有任何数字跳过。

你的文件中可能最后有一个空行。你需要重新创建表

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];

希望这有帮助。

看来用户grandepivko是对的

将AUTO_INCREMENT设置回1(或至少设置为1)将下一个AI设置为正确的值

因此,在
加载数据填充之后,将
自动增量
设置回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
下面是一个片段:

[2013年3月12日23:50]Don Hui顺便说一句,还有一个解决办法是 将表自动递增计数器更改为1,使其重置为最大值 记录数:

ALTER TABLE TABLE AUTO_INCREMENT=1

在该表的自动增量重置为主键的最大+1值之后


我猜mysql正在保留一个内部计数器。我能做什么呢?在自动递增的ID中有一个“间隙”有什么问题?此功能的目的正是为了保持记录的唯一性。我删除了几次表并重新创建了它,第一次运行“load data…”命令时,它工作正常,但如果我立即再次运行,它的增量会非常大(跳过一个id)。您是否运行了我发布的ALTER命令?是否多次运行“加载数据”命令?您的csv文件中是否有不必要的ctrl-lf?(尽管这会在表中创建一个可见行)。此外,您还可以尝试放置诸如NOT NULL之类的约束,以便抛出错误。如果您的数据大小不太大,并且没有id相关的记录,则您可以简单地将所有csv文件加载到表中,然后删除id并重新创建它,这将按顺序设置所有id。例如
altertable
product`DROP
id
;ALTER TABLE
product
ADD
id
INT NOT NULL自动增量主键优先`