• ベストアンサー
  • 困ってます

MySQL の load data infile

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

共感・応援の気持ちを伝えよう!

  • MySQL
  • 回答数1
  • 閲覧数55
  • ありがとう数1

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

  • ベストアンサー
  • 回答No.1

REPLACE および IGNORE キーワードは、一意のキー値に関して既存の行を複製する入力行の処理を制御します。 REPLACE を指定した場合は、入力行によって既存の行が置き換えられます。つまり、主キーまたは一意のインデックスに関して既存の行と同じ値を持つ行のことです。セクション13.2.8「REPLACE 構文」を参照してください。 IGNORE を指定した場合は、一意のキー値に関して既存の行を複製する行は破棄されます。 どちらのオプションも指定しない場合、その動作は LOCAL キーワードが指定されているかどうかによって異なります。LOCAL が指定されていない場合は、重複キー値が見つかるとエラーが発生し、テキストファイルの残りは無視されます。LOCAL が指定されている場合、デフォルトの動作は IGNORE が指定されている場合と同じです。 https://dev.mysql.com/doc/refman/5.6/ja/load-data.html

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ご回答ありがとうございました。 お礼が遅れたことをお詫びいたします。 既にテーブルにあるメインキーとバッティングするキーを持つデータを load data しようとする時に REPLACE または IGNORE を指定するということですね。 メインキーは自動生成(auto increment)するID番号なので、これがバッティングすることはないと思いますが、この場合にはREPLACE も IGNORE も必要ないのでしょうか? ご確認いただけると有り難いです。

関連するQ&A

  • Load Data INFILE構文について

    お疲れ様です。 いつもお世話になっております。 既にデータが入っているテーブルに対して、CSVをインポートし、該当のレコードだけUPDATEをかけたいと思っています。 ID,名前,備考,属性 1,aaa,, 2,bbb,BBB, 3,ccc,,zok3 4,ddd,,zok4 5,eee,EEE, というデータがあり、これに対して 1,,,zok1 2,,,zok2 5,,,zok5 6,fff,FFF,zok6 というデータを持つcsvを突っ込もうと思っています。 その場合、IDが1,2,5の名前や備考はNULLで上書きされてしまうのでしょうか? また、既存のテーブルにないcsvのID6は入れないようにしたいのですが、これだとLOAD_DATA_INFILEというよりただのUPDATEです。 これらのデータが100万件あって、属性の抜けだけを補完し、既にテーブルから消されているデータはINSERTしたくないのですが、何かスマートな方法はないでしょうか? よろしくお願いします。

    • ベストアンサー
    • MySQL
  • 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
  • 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
  • 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
  • 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 ・他に何か設定する項目などあるのでしょうか? ・それとも何か手順が足りないのでしょうか? すごく簡単なことなのかもしれませんが、 ご教授の程、よろしくお願いいたします。

  • BitフィールドにLOAD DATAできない

    以下の定義のテーブル(Bitフィールドを持つ)にLOAD DATAでデータを 入れようとしているのですがエラーになり困っています。 マニュアルにあるようにSET句を使用してLOADをしようとしているのですが 「You have an error in your SQL syntax;~」と コマンドの4行目のところで出てしまいます。どこがおかしいのでしょうか。 【テーブルの定義】 mysql> desc data; +-------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+----------+------+-----+---------+-------+ | key1 | int(11) | NO | PRI | NULL | | | key2 | int(11) | NO | PRI | NULL | | | date | datetime | NO | PRI | NULL | | | flg1 | bit(1) | NO | | b'1' | | +-------+----------+------+-----+---------+-------+ 【CSVファイルの内容】 1,2,"2016-12-17 10:00:00",1 1,2,"2016-12-17 11:00:00",0 【コマンド】 LOAD DATA INFILE 'C:/csv/data.csv' INTO TABLE test.data (key1, key2, date, @var1) SET flg1 = CAST(@var1 AS SIGNED) FIELDS TERMINATED BY ',' ENCLOSED BY '"';

  • 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
  • SQL Serverでのデータロードについて質問

    SQL Server初心者です。 CSVファイルのデータをテーブルにロードするにあたり、以下のような事をするにはどんな方法があるのでしょうか?  ケース1:CSVファイルのデータでテーブルを上書き  ケース2:主キーが一致するレコードがテーブル内に存在する       データはUPDATE,なければINSERT ケース1,2それぞれDB2でいうところのImportコマンドを使用した時のREPLACEモード及びINSERT_UPDATEモードのイメージです。 DB2のように簡単にはいかないものでしょうか。 よろしくお願いします。

  • CentOS(Linux)上の/var/lib/mysqlディレクトリ

    CentOS(Linux)上の/var/lib/mysqlディレクトリ上(MySQLデフォルトのデータディレクトリ)へ、 CSVファイル「Test.csv」(文字コードWindows-31J(CP932))を、 アップロードしてから、 以下のJavaプログラム(エラー処理内容だけは省略していますが・・・)  ↓ final Runtime rt = Runtime.getRuntime(); final Process pr = rt.exec("chown mysql:mysql" + " " + "/var/lib/mysql/Test.csv"); try { pr.waitFor(); final int intRet = pr.exitValue(); if (intRet != 0) { return; } } catch (final Exception ex2) { return; } を実行して、 アップロード後の「Test.csv」ファイルの「所有者」、および「グループ」を、 元々の「root」から、「mysql」に変更させて、 その後、 MySQLコマンドの「LOAD DATA INFILE」を実行すると、 なぜか、 以下のエラーが発生します。  ↓ java.sql.SQLException: Access denied for user 'SYSASA'@'localhost' (using password: YES) なお、別のやり方として以下のテストも試してみました。  ↓ 上記のJavaプログラムを実行せずに、 アップロード後のファイルを直接、 CentOS上から手作業(プロパティ)で、 アップロード後の「Test.csv」ファイルの「所有者」、および「グループ」を、 元々の「root」から、「mysql」に変更させてから、 その後、 MySQLコマンドの「LOAD DATA INFILE」を実行すると、 問題無く、インポート出来ています。 そこで、 ご質問内容なのですが、 Javaプログラムを利用しているか、していないか だけの違いで、 なぜか、上記致しましたJavaプログラムで、 アップロード後の「Test.csv」ファイルの「所有者」、および「グループ」を、 元々の「root」から、「mysql」に変更させてから、 MySQLコマンドの「LOAD DATA INFILE」を実行すると、 上記のエラーになります。 何がエラーの原因なのでしょうか? もしお気づきの点などございましたら、 ぜひ教えてください。 お世話になります。 以上、宜しくお願い致します。

    • ベストアンサー
    • MySQL
  • mysqlについての質問です。

    macbook air の mountaion lion を使用しています。 csvファイルをmysqlのコマンドラインから呼び込もうとすると mysql> load data infile "file://localhost/Users/uekikouji/excel/t.csv" into table tb1N fields terminated by ','; ERROR 13 (HY000): Can't get stat of '/usr/local/var/mysql/file:/localhost/Users/uekikouji/excel/t.csv' (Errcode: 2) と表示されます。なにが原因でしょうか悩んでいます。よろしくお願いします。

    • ベストアンサー
    • MySQL