2011-12-14 36 views
0

データをテキストファイルからデータベースにロードしたい場合は、データが既に存在する場合はロード中にそのデータをエスケープする必要があります。重複を排除してテキストファイルからmysqlデータベースにデータをロード

以下のクエリを使用して、テキストファイルからmysqlデータベースにデータをロードしています。

「ロードデータINFILE:によって終了テーブルwbrdatatable フィールドに 'F /wbrdata.txt' '' は、任意で囲ま "によって終了" ライン '\ R \ n' は 1つのライン(チャンネル、時間を無視、pulserate、dwellid、targetid); "

既存のテーブルデータにデータを追加しています。データベースにロード中にテーブル&ファイルに既に存在する(重複している)共通データは避けたい。

これをどのように達成できますか? はあなた

よろしく Sankarの

+0

何プログラムは、Javaで – BizApps

+0

をMySQLへのテキストファイルをロードするために使用します。 – sankar

+0

私はシンプルなJDBCプログラムを使ってこのクエリをロードしていますString str = "データinfile 'F://Hello.txt'をテーブルnewwbrtableにロードします。 '、'によって終端されます。 \ n '1行(time、channel1、channel2)を無視する; "; Class.forName(ドライバクラス).newInstance(); con = DriverManager.getConnection(jdbcURL、user、password); st = con.createStatement(); – sankar

答えて

1

その後、一時テーブルから重複を削除し、ターゲット表に残りの部分をコピーし、(ターゲット表と同じ)一時テーブルにテキストファイルをロードするようにしてください。


例(テキストファイルからのすべてのデータを一時テーブルがwbrdatatable_tempであると仮定):私は、クエリの上に実行するプログラムを書いた

CREATE TABLE wbrdatatable(
    id INT(11) NOT NULL AUTO_INCREMENT, 
    column1 VARCHAR(255) DEFAULT NULL, 
    PRIMARY KEY (id) 
); 

INSERT INTO wbrdatatable VALUES 
    (1, '111'), 
    (2, '222'), 
    (3, '333'), 
    (4, '444'), 
    (5, '555'); 

CREATE TABLE wbrdatatable_temp(
    id INT(11) NOT NULL AUTO_INCREMENT, 
    column1 VARCHAR(255) DEFAULT NULL, 
    PRIMARY KEY (id) 
); 

INSERT INTO wbrdatatable_temp VALUES 
    (1, '111'), 
    (2, '222'), 
    (10, '100'), -- new record that should be added 
    (11, '200'); -- new record that should be added 

-- Copy only new records! 
INSERT INTO wbrdatatable 
SELECT t1.* FROM wbrdatatable_temp t1 
    LEFT JOIN wbrdatatable t2 
    ON t1.id = t2.id AND t1.column1 = t2.column1 
WHERE t2.id IS NULL; 

-- Test result 
SELECT * FROM wbrdatatable; 
+----+---------+ 
| id | column1 | 
+----+---------+ 
| 1 | 111  | 
| 2 | 222  | 
| 3 | 333  | 
| 4 | 444  | 
| 5 | 555  | 
| 10 | 100  | -- only new record is added 
| 11 | 200  | -- only new record is added 
+----+---------+ 
+0

私はあなたが私の質問を得なかったと思います。テキストファイルからデータベースにデータを読み込む際に、同じデータがテーブルに存在する場合、そのデータはスキップされ、残りはテーブルにロードする必要があります。 – sankar

+0

すべてのデータを別のテーブルにロードし、重複を削除してレコードを追加することをお勧めしました。 1つのクエリを使用して削除/追加することもできますが、私は答えに例を追加します。 – Devart

+0

ありがとうございます。それは私のために便利です。しかし、それは同じデータ(一時テーブル)のために追加のメモリを使用しています、それは巨大なデータベースファイルで問題を作成しませんか?その前に、既存のデータをエスケープするために私のクエリ(データベースにファイルを読み込む)とともにいくつかの条件でいくつかのサブクエリを使用することはできません。このタイプの質問については私のことをしないでください。もう一度ありがとう.... – sankar

0

に感謝このロジックを試してみてください。

1. Upload Text File Data 
    2. Check record using select statement on your database 

    if(recordexist==true) 
      save 
    else 
      not save 

よろしく

+0

お返事ありがとうございます。つまり、ファイルからデータベースへのデータのロードが完了した後、すべての重複をフィルタリングする必要があります。サブクエリを使用してデータベースにロードする際に重複を排除することはできません。あなたがその構文を送ることができると分かっているなら、...... – sankar

関連する問題