2016-07-14 9 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は保持されています。

あなたは、あなたはCSVファイルのインポートを実行することができます自動インクリメントコマンドを使用して、特定のポイントなどのID 3で

ALTER TABLE product AUTO_INCREMENT = 4; 

を開始することを強制することができます。

私はあなたのテーブルを複製し、数字をスキップせずにコードを実行しました。

+0

私はテーブルを数回落として再作成しました。 "load data .."コマンドを実行するのは初めてですが、すぐに再度実行すると、ひどく(1つの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- 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 

、スニペット:

[2013年3月12日午前23時50分]ドンホイところで、別の回避策が存在するが、1〜 ALTERテーブルAUTO_INCREMENTカウンタにあるので、リセット

ALTER TABLEテーブルのAUTO_INCREMENT = 1

にそのテーブルのAUTO_INCREMENTのリセット後:レコードの最大数に PRIMARY KEYのMAX + 1値

関連する問題