• ベストアンサー

mysqlでCSVインポートでトランザクション管理出来る

只今、mysqlを使用して開発しております。 行き詰まっておりまして 大変申し訳ありませんが、ご教授の程、よろしくお願いいたします。 要件は以下になります。 ・CSVファイルデータをインポートする。 ・CSVファイルは複数なので、全ての処理が終わった段階でコミット・もしくはロールバックする。 (トランザクション管理が出来ればよいです。) ※LOAD DATA INFILEでトランザクション管理しようとしたのですが LAODのトランザクション管理は5.1系じゃないと出来ないようですので、 出来ませんでした。 mysqlのバージョン :5.0.24

  • MySQL
  • 回答数3
  • ありがとう数3

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

  • ベストアンサー
  • galluda
  • ベストアンサー率35% (440/1242)
回答No.3

がるです。 んと…「膨大な量」とのことなので、別のラインで。 たとえば ・仮テーブルを用意する ・「仮テーブルに対して」個々にCSVをインポートしていく ・すべてのインポートが終わって  ・もしすべて問題なく処理できたら、begin tranして仮テーブルのすべての内容を本テーブルにinsert、処理OKならcommitする  ・インポート中に問題がおきたら適切なエラー処理をして仮テーブルの全レコードを削除する なんていう方法もあろうかと思います。 ま、結構横道な手段ですが。

bakenshibakenshi
質問者

お礼

galluda様、ご教授有難う御座います。 おぉ~こういうやり方もあるんですね。 大変参考になります。

その他の回答 (2)

  • mooboogie
  • ベストアンサー率68% (28/41)
回答No.2

バルクインサートは、可能だと思いますので、 CSV 1,"aaa","kkk" 2,"bbb","jjj" 3,"ccc","lll" 上記をアプリケーションなどで編集して、 insert into table1 values (1,"aaa","kkk"), (2,"bbb","jjj"), (3,"ccc","lll"); というような文へ変換して実行すればご要望の状況が実現可能かと思います。 ただし、数千件を一回のInsert文に突っ込むことはできなかったと思います。 最大行数は何行かは知りません。 100行から200行程度ならOKだったと思います。

bakenshibakenshi
質問者

お礼

mooboogie様、ご教授有難う御座います。 データ量は膨大でファイル数も多いと考えております。 ですので、mooboogie様も危惧されているように 最大行数のエラーになるかもしれません。 何行くらいまでいけるか調べておかないといけないかもしれませんので いいヒントを頂きました。 どうも有難う御座いました。

  • galluda
  • ベストアンサー率35% (440/1242)
回答No.1

がると申します。 ごく単純に「まず複数のCSVファイルを一つにまとめてから処理をする」ではだめなのでしょうか? 直接的な回答ではなくて申し訳ないのですが。

bakenshibakenshi
質問者

お礼

galluda様、ご教授有難う御座います。 要件に詳しく書けばよかったのですが CSVファイルは多数あり、データ量も膨大と考えております。 少ないデータ量でしたら、galluda様の案も出来ますね。 参考になりました。 どうも有難う御座いました。

関連するQ&A

  • 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
  • インターフェースからCSVを取り込んで、MySQLにインポート

    インターフェースからCSVを取り込んで、MySQLにインポート ブラウザのインターフェースからCSVファイルを選択して、MySQLにインポートするようにしたいのですが、 (1)ファイルのアップロード (2)サーバー上にある(アップロードされた)CSVファイルをMySQLにインポート という手順で処理するほかないでしょうか? ローカルのCSVファイルを直接MySQLにインポートするような画期的な方法(ライブラリなど)あったらいいなと思い質問します。 PHPのバージョン:5.2 MySQLのバージョン:5.1 です。 まだ基本設計の段階なので、具体的な質問になっておらず申し訳ありませんが、 よろしくお願いします。

    • 締切済み
    • PHP
  • mysqlにcsvを importしたい。

    初心者です。 http://www.phpkode.com/scripts/item/quick-csv-import/ のQuick CSV import 1.0にて mysqlにcsvをインポートしようとしてもヘッドの題名しかインポートされません。 データーがインポートされないのです。 Access denied for user '*****'@'****' (using password: YES) というエラーが出ます。(*)はdatabasenameと(@'****' (この意味は分かりません))です。 いろいろいじってるのですが、状況は変わりません。 phpmyadminから見ると ヘッドの部分(1行めの題名)はインポートできているので このエラー文のせいかどうかもわかりません。 データー、題名ともすべて半角英数です。 実際にこのフリーソフトのことではなくても、 症状に対するヒントだけでも頂きたいと思っています。 どうかよろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • PHP+MySQL でのcsvファイルインポート

    PHP + MySQL で、他システムから出力されてきたcsvファイルをテーブルへインポートしたいと考えています。 LOAD DATA INFILE で取り込もうとしていますが、対象のcsvファイルの特徴のためにうまく行かず苦戦しています。 取り込みたいファイルは、以下のようになっています。  ・各フィールドが "(ダブルクォート) で囲まれている  ・各フィールドは ,(カンマ) で区切られている  ・金額の項目には、桁区切りのカンマが入っている  例) "0001","あああああ",…(中略)…,"105,000","100,000","5,000",…     コード 項目名            税込み  税抜き 消費税  というような形です。    困っているのは、金額に使われている、桁区切りのカンマの処理についてです。  目的としては、データベースへ取り込むときには 105,000 は 105000 として取り込めればいいのですが、他システムから、桁区切りがなされた状態でcsvが作成されてきています。 LOAD DATA INFILE test.csv INTO TABLE data_table FIELDS TERMINATED BY ',' ENCLOSED BY '\"' IGNORE 1 LINES;  各項目のダブルクォートはENCLOSED BY で、項目を分けるカンマはTERMINATED BYで処理できていると思うのですが、金額の区切りに使われているカンマと項目の区切りのカンマを区別させられずに苦戦しています。  事前にcsvを加工するのも考えてはいるのですが、なるべくcsvを加工せずにそのまま取込したいと思います。  何か、簡単に回避できる方法等があればご教示願います。  宜しくお願いします。

    • ベストアンサー
    • PHP
  • MySQLのトランザクションについて

    WEBアプリ上の、MySQLのトランザクションについて質問です。 トランザクションは、データの挿入に矛盾がない場合commitすることによって データの挿入等を確定する機構だとおもいますが、 この仕組みって、トランザクション中は作業対象のテーブルは実行中のクライアント以外 アクセスできなくなる(※つまりロック?がかかっている?)のでしょうか? そうじゃないと、意味がないですよね?やっぱり。。。 また仮にですが、例えばAというクライアントがWEBサイトにアクセス中に Bというクライアントが待ったく 同じ動作を同じタイミングでアクセスした場合ってどうなるのでしょうか? 実際、WEBアプリでそこまでの例外というか処理って行うものでしょうか? また、ちなみにMySQLの場合、 "START TRANSACTION" というSQL文だけでなく AUTOCOMMIT = 0 として、自動コミットをオフにしつつ beginという式で トランザクションを開始する方法があるようですが、実際はどちらの方が当たり前のほうほうなのでしょうか? 識者の方ご教授ください。

    • ベストアンサー
    • MySQL
  • phpMyAdminでのデータのインポートについて

    はじめまして。 レンタルサーバーで、MySQLを利用しています。 利用しているレンタルサーバーは、TELNETなどは利用できず、MySQLのデータベースを管理するのに、phpMyAdminを利用するようになっています。 用意したCSVファイルをサーバーのデータベースにインポートしたら、csvファイルが2MBを超えており、phpMyAdminの管理画面のインポートからは、2MB以内に分割しないとアップできませんでした。 分割するのが面倒なので、1回でインポートできないかと思い調べたら、 SQLで、LOAD DATA INFILE でインポートできないかと思い試してみました。 最初は、LOCALというのを入れずにやったらエラーが出たのですが、これは、同じサーバーにアップされたファイルからインポートというこなので、権限がないので無理ということがわかりました。 そこで、LOCALをつけて試しました。 ●試したSQLの内容 LOAD DATA LOCAL INFILE 'c:\mihon.txt' REPLACE INTO TABLE test FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'; 上記をphpMyAdminのSQLのとろこで、実行したのですが、エラーなどは表示されずに完了するのですが、データはインポートされていませんでした。 レンタルサーバーで、phpMyAdminを利用している場合に、LOAD DATA INFILEでファイルをインポートできないのでしょうか?上記のSQLの書き方に問題があるのでしょうか? 初心者なのであまりうまく説明できませんが、大容量のCSVファイルをphpMyAdminからアップするには、なにかよい方法はありますでしょうか? ご回答よろしくお願い致します。 ●サーバーの環境 ・MySQL利用可能で、phpMyAdminでのみ利用可能 ・データベースは、ユーザーサーバーとは別に設置 ・MySQLのバージョンは、4.0.26 ・phpMyAdminのバージョンは、2.7.0

  • CSVファイルのインポートについて

    宜しくお願いします。 CSVファイルをインポートしようとして、四苦八苦しています。item.csvというファイルをitemという名前のテーブルにインポートしようとしています。 load data local infile "item.csv" into table item fields terminated by ','; とコマンドを入力すると、 The used command is not allowed with this MySQL version というエラーが返されます。そこで、 load data infile "item.csv" into table item fields terminated by ','; と入力すると、 Access denied for user: '****@localhost' (Using password: YES) というエラーが返されます。 csvファイルの置き場所も解らないので、同じサーバの/public_html/test/php/csv/item.csvという位置と、/public_htmlよりもう一階層上のフォルダにitem.csvというファイルをアップしてあります。 相対パスやサーバがどの程度の階層まで検索してくれるのか解らないので、絶対パスでも指定してみましたが、全く同じエラーが返されてきました。 エラーの内容を翻訳してみたところ、 The used command is not allowed with this MySQL version 「使用されたコマンドは、このMySQL版で許されない」 Access denied for user: '****@localhost' (Using password: YES) 「ユーザー:『****@localhost』(パスワード:YESを使うこと)のために許されないアクセス」 という意味になりました。正直、どうすればいいのかさっぱりわかりません。この状況の打開策をご教授頂ければ助かります。何卒、宜しくお願い致します。尚、MySQLのバージョンはレンタルサーバの情報によると、「3.23.××以降」となっています。

    • ベストアンサー
    • MySQL
  • MySQLで連続csvファイルを読み込むために

    MySQL 5.6を最近使い始めました。 大量のcsvファイルで保存されているデータを読み込んで、データベースとして扱いたいのですが、どうすれば良いでしょうか? ファイル名は、 data1_1.csv data1_2.csv data1_3.csv data2_1.csv data2_2.csv といった形で、規則正しく並んでいるのですが、大量にあるため、ループを使って自動化したいと思っております。そのために、LOAD DATA INFILE ファイル名 を使って、このファイル名を順次変えて繰り返す方法がわかりません。 まず、ファイル名に変数が使えるのかと思って @file="data1_1.csv"としてファイル名を置き換えてみたのですが、エラーでした。これでは、この1_1を順次動かす以前に変数が無理なのかも?と思っています。 何かやり方があるようでしたら、どなたかお教えください。 どうぞよろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • オフライン中のトランザクションについて

    表領域をオフラインにした場合、オフライン前に開始されたトランザクションは有効ですが、オフラインのまま、コミット、または、ロールバックして、表領域をオンラインにしても、整合がとれるのはなぜなのでしょうか。 コミットするか、ロールバックするかの情報はどこに保持してるのか疑問です。 (オフラインにしてから、ファイルをリネームし、 トランザクションをロールバックして、 ログをアーカイブし、DB再起動後に、ファイル名を戻して、 オンラインにすると、ちゃんとロールバックされています。 同じ操作で、コミットするとちゃんとコミットされています。 知っている方には当然なのでしょうが、私にとっては、不思議です) 詳しい方がみえましたらご教授お願いいたします。

  • mysqlのデータインポートについて

    こんばんは。 エクセルで作ったcsvファイルをmysqlにインポートしたいのですが、 エラーが出て出来ずに困っています。 エラーの内容は、Row 1 doesn't contain data for all columsと出ています。 データが無いという事なのですが、csvファイルにはデータがあります。 mysqlのフィールドの属性の問題でしょうか? 考えられる原因など教えて頂けますと大変助かります。 宜しくお願い致します。

    • ベストアンサー
    • MySQL