【问题标题】:Import from CSV file to mysql database ERROR从 CSV 文件导入 mysql 数据库错误
【发布时间】:2016-11-17 07:00:55
【问题描述】:

我正在尝试将一些记录从 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 字段(代码是别的)。

【问题讨论】:

  • 我的猜测是mysql保留了一个内部计数器。
  • 我该怎么办?
  • 在您的自动递增 ID 中有“间隙”有什么问题?此功能的目的正是为了保持记录的唯一性。

标签: mysql csv command-line insert auto-increment


【解决方案1】:

看来用户grandepivko是对的。

将 AUTO_INCREMENT 设置回 1(或至少是它的努力)会将下一个 AI 设置为正确的值。

因此,要点是将AUTO_INCREMENT 设置回 1 LOAD DATA INFILE

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,一个sn-p:

[2013 年 3 月 12 日 23:50] Don Hui Btw,还有另一种解决方法是 将表 AUTO_INCREMENT COUNTER 更改为 1,因此它重置为最大值 记录数:

ALTER TABLE 表 AUTO_INCREMENT=1

在该表的 AUTO_INCREMENT 重置为 PRIMARY KEY 的 MAX+1 值之后

【讨论】:

    【解决方案2】:

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

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

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      我的猜测是你之前添加了一行并删除了它,所以 id 被保留了。

      您可以使用自动增量命令强制它从特定点开始,例如 id 3

      ALTER TABLE product AUTO_INCREMENT = 4;
      

      然后您可以运行 csv 导入。

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

      【讨论】:

      • 我删除了几次表并重新创建了它,第一次运行“加载数据..”命令它工作正常,但如果我立即再次运行它,它会严重增加(跳过一个ID)。
      • 您是否运行了我发布的 ALTER 命令?您是否多次运行 LOAD DATA 命令?您的 csv 文件中是否有不必要的 ctrl lf? (尽管这会在您的表中创建一个可见的行)。您也可以尝试放置诸如 NOT NULL 之类的约束,这样会引发错误。
      • 如果您的数据量不是太大并且没有与 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
      【解决方案4】:

      ALTER TABLE 表名 AUTO_INCREMENT = 1;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-15
        • 1970-01-01
        • 2020-09-12
        • 1970-01-01
        • 2019-02-21
        • 1970-01-01
        • 2017-11-14
        • 1970-01-01
        相关资源
        最近更新 更多