2012-01-15 18 views
-1

次のスクリプトを使用してMYSQLデータベースにレコードをアップロードしています。クライアントレコードがアップロードされ、すでにデータベースに存在し複製されている場合があります。アップロードされたCSVからMYSQLデータベースの重複を防止

ここでは、アップロード時にcsvファイル自体から重複を削除する方法を尋ねる人がたくさんいます。たとえば、bobという名前のインスタンスが2つあり、csvのlh456glというポストコードがアップロードしていない私が知りたいのは、すでにレコードが存在するレコードを挿入しないように、そのレコードを追加する前にレコードをデータベースでチェックすることが可能かどうかです。

だから、のようなもの:

if exist namecolumn=$name_being_inserted and postcode=postcode_being_inserted then 
    do not add that record. 

を行うのは、これがさえ可能ですか?。

<?php 
//database connect info here 

//check for file upload 
if(isset($_FILES['csv_file']) && is_uploaded_file($_FILES['csv_file']['tmp_name'])){ 

    //upload directory 
    $upload_dir = "./csv"; 

    //create file name 
    $file_path = $upload_dir . $_FILES['csv_file']['name']; 

    //move uploaded file to upload dir 
    if (!move_uploaded_file($_FILES['csv_file']['tmp_name'], $file_path)) { 

     //error moving upload file 
     echo "Error moving file upload"; 

    } 

    //open the csv file for reading 
    $handle = fopen($file_path, 'r'); 

    while (($data = fgetcsv($handle, 1000, ',')) !== FALSE) { 

     //Access field data in $data array ex. 
     $name = $data[0]; 
     $postcode = $data[1]; 

     //Use data to insert into db 
     $sql = sprintf("INSERT INTO test (name, postcode) VALUES ('%s','%s')", 
        mysql_real_escape_string($name), 
        mysql_real_escape_string($postcode) 
        ); 
     mysql_query($sql) or (mysql_query("ROLLBACK") and die(mysql_error() . " - $sql")); 
    } 

    //delete csv file 
    unlink($file_path); 
} 
?> 
+3

レコードが重複しているかどうかを判断するために使用するすべての列に一意のインデックスを追加するだけです。そうすれば、MySQLは重複を挿入することはできません。あなたはインテリジェントな何かをしたい場合に挿入する前にselectを実行する必要があるかもしれませんが、住所構成要素の空白/句読点の計算のように。 – DaveRandom

+0

こんにちは、このデータは既存のデスクトップクライアントはクライアントからのデータをエクスポートしてインポートするだけなので、インポートする主キーはなく、クライアント管理ソフトウェアのフィールドだけがインポートされます。 – user1148760

+1

PKである必要はなく、ユニークなインデックスだけです。 2つは同義ではなく、互いに排他的ではありません。 – DaveRandom

答えて

1

私はこの問題を扱うことができると思う2つの純粋なMySQLの方法があります。 REPLACE INTOおよびINSERT IGNORE

REPLACE INTOは既存の行を上書きしますが、INSERT IGNOREは重複キーがデータベースに入力されたときに発生するエラーを無視します。

これはようdescribed in the manual次のとおりです。

キーワードをIGNOREを使用している場合は、 INSERT文を実行中に発生するエラーではなく警告として扱われます。たとえば、 IGNOREを指定しないと、既存のUNIQUE索引またはPRIMARY KEYを複写する行 の値が重複キー・エラーとなり、文は になります。 IGNOREでは、行は挿入されませんが、エラーは で発行されません。

INSERT IGNOREの場合、1つ以上のフィールドにUNIQUEキー/インデックスを設定する必要があります。コードサンプルを見ると、挿入クエリで一意とみなせるものはありません。ウォルバーハンプトンにジョン・スミスが2人いるとどうなるでしょうか?理想的には、独自のものとして定義する電子メールアドレスのようなものがあります。

+0

こんにちは、私はテストテーブル上の瞬間にそれをテストしています。フィールドは次のようになります。氏名、郵便番号、電子メール、電話番号、住所、および使用する燃料の種類に関連するさまざまなフィールドが含まれます。このようなファイルをアップロードしたり挿入したりするときにON DUPLICATE KEY UPDATEを使用することは可能ですか?それとも、データのプライマリキーを挿入しないので機能しませんか? – user1148760

+0

ああ、私はあなたの来るところを見ていると思うので、もし私が電話番号をDBのプライマリキーと言うことができれば、それは働くかもしれない会社にとって非常にユニークです。問題は、情報を入れているテーブルが主キーを持っているため、最初にデータをインポートして移動するために別のテーブルを一時テーブルとして使用する必要があるかもしれないということです。 – user1148760

+0

プライマリキーでなく、一意のキーである必要はありません。 – Treffynnon

1

は単にそのフィールドの両方の値を持つ行が既に存在するときに行を挿入することができない、名前と郵便番号のユニークなキーを作成します。

+0

こんにちは、問題は、このデータは既存のデスクトップベースの顧客レコードシステムから来ていて、クライアントはそのデータをエクスポートしてインポートするだけなので、クライアント管理ソフトウェアのフィールドだけがインポートされることはありません。 – user1148760

0

私は、レコードがデータベースに挿入されるようにしましょう、その後、それらのレコードを挿入した後、単に実行します:

あなたは重複を持たせたくない場合は、aとbは、あなたの列です
ALTER IGNORE TABLE dup_table ADD UNIQUE INDEX(a,b); 

(キー列...あなたはそれらをもっと持てる)。すべてをトランザクションにラップすることができます。つまり、トランザクションを開始し、すべてのレコードを挿入し(重複していても)、実行したコマンドを実行し、トランザクションをコミットしてから、その(a、b)ユニークインデックスを削除して次のインポートを準備します。簡単です。

関連する問題