プロが教えるわが家の防犯対策術!

MySQLのLOAD文を使ってCSVファイルの内容をデータベースにインポートしたいと思っています。


そこで、下記のような内容のCSVファイルを作成しました

ファイル名:word_list1.csv
↓ファイルの内容↓
1,apple
2,egg
3,music
4,movie
5,baseball

作成した word_list1.csv の保存場所は
C:/hole_problem/word_list1.csv
です


また、word_list1.csv の内容をインポートするデータベース側のテーブルは下記のコマンドにより定義されています

CREATE TABLE word_list(
id INT AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
CONSTRAINT id_pri PRIMARY KEY (id)
) ENGINE=InnoDB;


CSVファイル word_list1.csv とデータベース側のテーブル word_list の準備が整ったところで下記のコマンドを実行しました

LOAD DATA LOCAL INFILE "C:/hole_problem/word_list1.csv" INTO TABLE word_list FIELDS TERMINATED BY ',';


コマンドはエラーなどなく正常に実行されましたが、実行後にデータベースを参照すると下記のようになっています

id name
2 egg
3 music
4 movie
5 baseball
35 apple


ここで質問なのですが、なぜ、CSVファイルでの順番とインポート後のデータベースでの順番が異なってきてしまうのでしょうか?
教えて頂けると助かります。

また、どのようにすれば順番が変わることなくCSVファイルの内容をデータベースにインポートできるのでしょうか?

A 回答 (2件)

#1です。



InnoDB + AUTO_INCREMENt + LOAD DATA INFILE で オートクリメントのケースでバグ報告があったのを思い出しました。
http://bugs.mysql.com/bug.php?id=45960

ただ、そのケースは BULK INSERT時にオートインクリメントされる値が、大きく飛んでしまうというものであり、数値定数で格納する場合は該当しません。

数値定数を格納するようにだけしていて、オートクリメントはさせていないでしょう?

(1)MySQLのバージョン
・・・MySQL5とかでなく、MySQL 5.1.36といった番号まで。
(2)提示された表定義で、実際にテストしているか
(3)提示された入力データで、実際にテストしているか
・・・auto_incrementを指定した列に、1以上の数値定数を必ず格納するように入力ファイルを作っているか?
(4)他に格納済データ、あるいは格納後に削除した行はないか
(5)CREATE TABLE後、LOAD DATA INFILE文を何度か実行したり、エラーになったりしていないか
(6)LOAD DATA INFILEの実行前後で、「SHOW CREATE TABLE tablename」による表定義情報の表示で、AUTO_INCREMENT=n の nの値は何になっているか
    • good
    • 0

OSは、Windowsですかね?



LOAD DATA INFILE文の最後に、

LINES TERMINATED BY '\r\n'

を追加してみてください。

詳細は、マニュアルを参照してください。
http://dev.mysql.com/doc/refman/5.1/ja/load-data …

なお、auto_incrementを使っているなら、数値定数を指定するのでなく、nullを格納しようとすれば自動でカウントアップしてくれます。
nullであることは、入力ファイル中では

\N

を入れておきます。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!