2016-07-14 4 views
0

csv 파일에서 mysql 테이블로 일부 레코드를 가져 오려고합니다. 내 테이블에는 id 필드가 자동으로 증가합니다. MySQL 커맨드 라인에서 다음 명령을 사용하여 데이터를 가져올 때, 필드 ID가 잘못 증가합니다. 마지막 ID가 3 인 경우 -> 삽입 된 첫 번째 레코드에 ID가 5 인 이유는 무엇입니까?CSV 파일에서 mysql 데이터베이스로 가져 오기 ERROR

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가 유지되었습니다.

당신은 그런 다음 CSV 가져 오기를 실행할 수있는 자동 증가 명령

ALTER TABLE product AUTO_INCREMENT = 4; 

으로 특정 시점, 예를 들면 ID 3에서 시작하도록 강제 할 수있다.

번호를 건너 뛰지 않고 테이블을 복제하고 코드를 실행했습니다.

+0

테이블을 몇 번 떨어 뜨리고 다시 작성했습니다. "데이터로드 .."명령을 처음 실행할 때 처음에는 제대로 작동하지만 명령을 다시 실행하면 심하게 증가합니다 (한 ID 건너 뛰기) . – DianaM

+0

내가 게시 한 ALTER 명령을 실행 했습니까? LOAD DATA 명령을 여러 번 실행합니까? csv 파일에 불필요한 ctrl lf가 있습니까? (이것은 테이블에 눈에 보이는 행을 만들지 만). 또한 오류가 던져 질 수 있도록 NOT NULL과 같은 constaints를 넣을 수도 있습니다. –

+0

데이터 크기가 너무 크지 않고 관련 ID가없는 레코드가 있으면 테이블에 모든 csv 파일을로드 한 다음 ID를 삭제하고 다시 작성하면 모든 ID가 순서대로 설정됩니다. 예 :'ALTER TABLE'제품'DROP'id'; ALTER TABLE'제품'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- auto-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 후 다시 1 -AUTO_INCREMENT을 설정하는 것입니다. Bug Report 이어 니펫 가입일

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 

: 그것은 리셋되도록

[12 삼월 2013 23시 50분]는 단 후이, BTW 다른 대안 1 테이블 변경 AUTO_INCREMENT 계수기이다 존재

ALTER TABLE 테이블 AUTO_INCREMENT = 1

에 해당 테이블의 AUTO_INCREMENT 재설정 후 : 레코드의 최대 수 PRIMARY KEY의 MAX + 1 값

관련 문제