[MySQL]LOAD DATA INFILEで一部レコードがスキップされる問題について

このQ&Aのポイント
  • MySQLのLOAD DATA INFILEを使用してテキスト形式のデータを読み込む際に、一部の行がスキップされる問題が発生しています。この問題について、原因やスキップされるケースについて詳しく調査したいです。
  • また、スキップされた行の詳細(何行目がスキップされたか、スキップされた理由など)を確認する方法についても教えていただけると助かります。
  • ご教示いただけると幸いです。よろしくお願いいたします。
回答を見る
  • ベストアンサー

[MySQL]LOAD DATA INFILE一部レコードがスキップさ

[MySQL]LOAD DATA INFILE一部レコードがスキップされてしまう。 いつもお世話になっております。selfesteemです。 今回はMySQLについての質問です。 仕事である機関が提供するデータをMySQLで扱うのですが、上手くいかなくて困っています。 テキスト形式での提供で、読み込み用スクリプトが付属していました。 LOAD DATA LOCAL INFILE "ファイル名" INTO TABLE "テーブル名" ~ で読み込むのですが、一部の行がスキップされてしまいます。 Query OKとは出てきているのですが、すべてのレコードがどうしてもインポートできず、 Skipped: ~ のようにスキップされた旨のメッセージが表示されています。 いろいろ試行錯誤してみたのですが、どこに問題があるのかいまいちつかめないでいます。 このLOAD DATA INFILE~で読み込む場合にスキップされるケースというのはどのような場合が考えられるのでしょうか? また、何行目がスキップされたのかや、スキップされた理由を詳しく調べることはできますでしょうか? 無知ですみませんが、本当に困っているので教えていただけると助かります。 よろしくお願いいたします。

  • MySQL
  • 回答数2
  • ありがとう数19

質問者が選んだベストアンサー

  • ベストアンサー
  • spieder
  • ベストアンサー率59% (13/22)
回答No.2

単純に考えるなら、こんな原因が考えられます。 ・プライマリーキー、ユニークインデックスがあって重複行がスキップされた。 ・カラムの型やNOT NULL制約に引っかかった ・文字コードや改行コードで、正常にインポートできない行があった ・一部のカラムのバイナリデータをロードしようとして正常に読み込めない etc… どちらにせよ、MySQLのバージョン、テーブル定義、読み込むファイルや作業手順等分からないことだらけですので、原因は判断できませんが…

selfesteem
質問者

お礼

spieder様、ご回答ありがとうございます。 そうですね。もう少し会社から情報をもってくるべきでした…すみません。 正常終了にしてもいろいろ原因が考えられるのですね。 挙げていただいた項目について、週明けにでもチェックしてみたいと思います。 chukenkenkou様のご回答とあわせてもう一度試行錯誤してみます。 本当に、ご親切にありがとうございますm(_ _ )m

その他の回答 (1)

回答No.1

まず、MySQLのバージョンを、少なくともMySQL 4.0、4.1、5.0といったレベルまでは、最低限明記するようにしてください。 MySQL 4.0以前とMySQL 4.1では、大きな機能拡張に加え、いくつかの仕様変更があります。さらに、MySQL 5.0でも同様です。仕様変更に関しては、「旧仕様と同等に動かしたいなら、SQL-MODEでオプションを指定する」といった設定を行うことで可能なものもあります。 >LOAD DATA INFILE~で読み込む場合にスキップされるケースというのはどのような場合が >考えられるのでしょうか? 少なくとも、次のような情報を提示して欲しいのですけどね。 (1)LOAD DATA INFILE文の指定内容を省略しすぎない (2)表定義での列構成、主キー、各列のデータ型、文字コード (3)どういうCSVデータを入力しているか ・・・特にNULLとしたいデータがある場合や日時データなど そうでなければ、せっかくアドバイスしても、質問者さんのケースには該当せず、無駄な回答になってしまう可能性がありますから。 >また、何行目がスキップされたのかや、スキップされた理由を詳しく調べることはできますでしょうか? MySQLのマニュアルを、少しは見ているでしょうか? LOAD DATA INFILEの項に、「SHOW WARNINGS を利用する」といった説明があり、リンクも貼られていますよ? まずはマニュアルを見て、エラーや警告内容を確認してください。 そして、その内容に従い対処してみてください。もし対処方法が分からない部分があれば、前述の項目を提示した上で、再質問するようにすれば、より適切な回答を、より早くもらえる可能性があると思いますよ。

参考URL:
http://dev.mysql.com/doc/refman/5.1/ja/load-data.html
selfesteem
質問者

お礼

chukenkenkou様、ご回答誠にありがとうございます。 バージョン等の情報不足に関しては重々承知しておりますが、会社のPCでは質問ができないため、 家に帰ってから記憶を頼りに質問しましたため、このような質問となってしまいました。 お気分を害されたこと深くお詫びいたします。 大変参考になる情報ありがとうございます。 気になっていたのは、クエリは正常終了であるという点です。 エラーログには、出力されておりませんでした。 Warningも0件でしたので、SHOW WARNINGS は調べておりませんでした。 ただ、改めてリンク先を確認させていただいたところ、 スキップされた理由も調べられそうな感じですね! 週明けに、一度確認してみたいと思います。 どうもありがとうございました。

関連するQ&A

  • LOAD DATA INFILE でエラー起きてデータを一括してロードできません。

    はじめまして。 質問があります。 現在WindowsXP Home、MySQL5.0.27を使用しているのですが、 テキストファイルのデータを一括でDBにロードしようとすると、 エラーが起きてしまいます。 ------------------------ Demo01.txt -------------------------- 1,あああ 2,いいい 3,ううう ------------------------ Demo01.sql --------------------------- create table test ( no integer not null, name varchar(30), primary key(no) )type=InnoDB; ---------------------------------------------------------------- mysql> load data low_priority infile 'C:/Demo01.txt' -> replace -> into table test -> fields terminated by ',' -> lines terminated by '/r/n' -> escaped by '\\'; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use : 'escaped by '\\'' 付近: 6 行目 ---------------------------------------------------------------- 上記のようなエラーが出てしまいますので、試しにescaped by '\\' を削除して実行すると、 ---------------------------------------------------------------- Query OK, 1 row affected (0.09 sec) レコード数: 1 削除: 0 Skipped: 0 Warnings: 0 ---------------------------------------------------------------- と表示され1行しかロードできません。どうしたら全行をロードするこ とができるのでしょうか?どうかご教授お願いします。

    • ベストアンサー
    • MySQL
  • LOAD DATA INFILE の使用について

    サーバにある、CSVファイルをデータベース(mysql)に登録したいです。 $query = "LOAD DATA INFILE '[ファイル名]' INTO TABLE [テーブル名] FIELDS TERMINATED BY ','"; を $result = mysql_query($query); として実行すると、 Access denied for user 'user'@'%' (using password: YES) というエラーになります。 色々検索すると、ユーザーはrootユーザーでないといけない・・・というのを見かけたのですが・・・ 普通のユーザーではLOAD DATA INFILEを使用できませんか? 私は、レンタルサーバを使用していて、レンタルサーバ上からしかユーザーを追加できません。 この場合、LOAD DATA INFILE~ は使用できないのでしょうか? また、もし使用できない場合、代替手段はあるのでしょうか?

    • ベストアンサー
    • PHP
  • MySQL の load data infile

    お世話になります。 MySQL のload data infile ... コマンドを使ってCSVファイルをテーブルに転送することをよくやっていますが、このコマンドには現在あるデータはそのままにして、新たにデータを追加するオプションなどはあるのでしょうか? 今までは空のテーブルにデータを転送していただけですが、既にあるデータに上書きすることなく、追加する方法があれば教えていただきたいと思います。 よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • mysqlのLOADでオートコミットオフにするには?

    大変お世話になっております。 mysql の LOADでオートコミットオフで作業することは可能でしょうか? 以下のように試してみましたが、オートコミットオフになっていないようです。 オートコミットオフになっていないと思った理由は 1、2とし、3でrollbackしてもロールバックできませんでした。 1.begin; 2.LOAD DATA INFILE "data.txt" INTO TABLE db2.my_table; 3.commit; もしくは rollback; my_tableはInnoDBです。 バージョン mysql : 5.0.23 ・他に何か設定する項目などあるのでしょうか? ・それとも何か手順が足りないのでしょうか? すごく簡単なことなのかもしれませんが、 ご教授の程、よろしくお願いいたします。

  • CSVファイルを毎日、全レコード一括更新したい

    毎日、CSV形式で送られてくる最新のデータがあります。 それを自動的にMySQLに一括で追加・更新したいと考えています。 CSVファイルは毎日、データが追加されたり、UPDATEされたり、削除されたりしています。そのCSVファイルのデータを神様DBとして、上書きしたいと思っています。 つまり、前日のMySQLのデータを本日のデータで完全に上書きしたいと考えています。 単にデータをロードするだけなら mysql> load data infile "ファイルパス/ファイル名.csv" -> into table テーブル名 fields terminated by "," lines terminated by "\n"; でよいと思いますが、完全上書きの方法がよくわかりません。 それとも、上記方法で同じことを2度すると完全に上書きされるのでしょうか?同じレコードが2つ出来上がるのでしょうか?それともマージされるのでしょうか? もし、お分かりでしたらご教授ください。

    • ベストアンサー
    • MySQL
  • CSVファイルをMYSQLにインポート

    先日からMYSQL+PHPの勉強をはじめました。 データベース構築の際、以前作成したCSVファイルをMYSQLのテーブルとして 利用したいと考えております。 そこで、MYSQLコマンドより、 LOAD DATA LOCAL INFILE 'ファイル名.csv' INTO TABLE テーブル名 FIELDS TERMINATED BY ',' LINES TERMINATED BY '\r\n'; Query OK, 0 rows affected (0.04 sec) Records: 102 Deleted: 0 Skipped: 102 Warnings: 0 とCSVファイル自体が悪いのかSQL文に問題がるのかインポートがうまくいきません。。 ちなみにCSVは  0,2011/6/2 0:00,80.94,81.32,80.55,80.92 0,2011/5/25 0:00,81.94,82.17,81.8,81.95 0,2011/5/23 0:00,81.77,82.04,81.32,81.99 環境はphpdevで一括でインストールした phpadmin: バージョン2.3.2 MYSQL: MySQL4 apache: 1.3.27 初心者で基本的な質問かもしれないですがどうかご教授お願いします。

    • ベストアンサー
    • MySQL
  • mysqlのloadコマンドに引数をセットするバッチの作成

    mysqlのloadコマンドに引数をセットするバッチの作成 データ移行でロードするファイルが数多くあり バッチ処理(param.bat)で実行できるようにしたいのですが、 SQLスクリプト(param.sql)にうまく引数を渡すことができません。 引数1にデータ:aaa.txt 引数2にテーブル:test_tbl どうかアドバイスいただけないでしょうか。 宜しくお願いいたします。 OS:Windows XP 【実行時】 c:temp>param.bat aaa.txt test_tbl 【作成したファイルの記述】 param.bat ------- mysql test1 -u user1 -puser1 < param.sql %1 %2 param.sql ------- LOAD DATA INFILE '&1' INTO TABLE &2 FIELDS TERMINATED BY ',' ESCAPED BY '\\' LINES TERMINATED BY '\r\n'; exit;

  • MySQLのLOAD DATAに関して

    MySQLのLOAD DATAで、固定長行フォーマットのファイルのロードを行っています。 その際、以下のような現象の原因がわからず困っています。 データをロードするテーブル、ロードファイル、実行コマンドは以下になります。 -------------------- テーブル -------------------- フィールド1 char(2) フィールド2 char(2) -------------------- ロードファイル(テキストファイル) -------------------- 1020 3040 -------------------- 実行コマンド -------------------- LOAD DATA INFILE 'ロードファイル' INTO TABLE テーブル FIELDS TERMINATED BY '' ENCLOSED BY '' LINES TERMINATED BY '\r\n'; 結果は以下のように、フィールド2にはデータが登録されていません。 ------------- フィールド1  | フィールド2 ------------- 10      |  30      |  望んでいる結果は以下のような結果です。 ------------- フィールド1 | フィールド2 ------------- 10     |20  30     |40  いろいろ試してみたのですが、 どうもchar(2)の場合は2バイトの倍の4バイト、 char(4)バイトの場合は倍の8バイトというふうにデータが区切られるため、 フィールド1のデータを取得する際に4バイト取得してしまっており、 フィールド2の分のデータが取得できません。 どこに不備があるのかわからないのですが、 何か原因の検討がつく方がいたら、ご回答よろしくお願いします。

    • ベストアンサー
    • MySQL
  • cronを使って、CSVファイルのデータをMYSQLへ定期的に投入したい

    cronを使って、CSVファイルのデータをMYSQLへ定期的に投入したいのですが、 色々試行錯誤してみてもうまくいきません。 (試しにmkdirを実行し、cronが動作していることは確認済みです) 以下が試行錯誤の内容です。 【1】 MYSQLIMPORT文を使用。 mysqlimport --host=ホスト名 -u ユーザ名 --password=パスワード --local --replace DB名 "ファイル名(フルパス)" SSHからの実行で動作確認をした文をそのままcronに登録しましたが、データは投入されず。 【2】 LOAD DATA INFILE文を使用 mysql --local-infile=1 --host=ホスト名 -u ユーザ名 --password=パスワード <<eof use DB名; LOAD DATA LOCAL INFILE 'ファイル名(フルパス)' INTO TABLE テーブル名 FIELDS TERMINATED BY ','; 命令はShellにまとめて書き、呼び出しました。 同様にSSHでは動作したものの、cronでは動作せず。 【3】 まずはDBを更新できるかどうかの確認を行うため、MYSQL接続とINSERT文をShellに書き出しました。 mysql --host=ホスト名 -u ユーザ名 --password=パスワード <<eof use DB名; INSERT INTO テーブル名 VALUES (1,1,1,1,1); SSHで動作確認したShellをcronで実行させたが、更新されず。 【4】 PHPスクリプトの実行 PHPを使って更新出来ないかテスト。 こちらもSSHでは動作したものの、cronとなると動作せず。 単純なINSERT文すら実行出来ないことから、cronではレコードを更新できないのでは?と思い始めております。 なにか設定が必要だったり、見落としている点があれば、ご教授ください。 サーバーはさくらサーバーで、MYSQLのバージョンは4です。 cron以外での実装方法があれば、そちらも併せてご教授ください。 よろしくお願いします。

  • GRANTステートメントによるユーザー追加について(LOAD DATA INFILEの権限)

    GRANTステートメントで、「LOAD DATA INFILE」の権限を持ったユーザ(例:kasai)を作成したいのですが、上手くいきません。 mysql> GRANTSELECT,INSERT,UPDATE,DELETE,CREATE,DROP,ALTER,LOAD DATA INFILE ON *.* TO kasai; ERROR 1064: You have an error in your SQL syntax. Check the manual that corresp onds to your MySQL server version for the right syntax to use near 'LOAD DATA IN FILE ON *.* TO kasai' at line 1 何かよい知恵を教えてください

    • ベストアンサー
    • MySQL