0

私はMySQLとPHPで働いています。MySQL では、重複を引き起こすことなく、追加のレコードで既存のテーブルをどのように更新しますか? レコードは顧客であり、各レコードのキーは「1234」などの顧客アカウント番号です。

基本的に3つのことをする必要があります。顧客アカウントが存在しない場合は新しい顧客レコードを追加し、電話番号や電子メール アドレスが変更されたなどの既存の顧客の情報を更新するか、顧客でなくなった場合は顧客レコードを削除します。

データは毎日フィードとして入ってきます。マーケティングは、独自のフィールドが追加された独自の顧客データベースを必要としています。そのため、毎日のフィードから単純にデータベースを再作成するわけではありません。目標は、フィードで最新の状態に保つことです。ありがとう!

4

4 に答える 4

1

PHP を使用してすべての処理を行うことをお勧めします。

顧客レコードをループするときは、最初にレコードが存在するかどうかを確認します。

$query = "SELECT customer_account_number FROM table WHERE customer_account_number = 1234";
$result= $mysql -> query($query);
$num   = $result -> num_rows;

if($num == 1){
   // The record already exists so you update.
   $update_query = "UPDATE table SET some_field = 'Some Value' WHERE customer_account_number = 1234";
   $update_result= $mysqli -> query($update_query);
}else{
   // The record doesn't exist so create a record.
   $insert_query = "INSERT INTO table (customer_account_number) VALUES (1234)";
   $insert_result= $mysqli -> query($insert_query);
}

または、1 つの選択クエリを実行して顧客のアカウント番号を取得し、それらを配列にポップすることもできます。

$query = "SELECT customer_account_number FROM table";
$result= $mysql -> query($query);
$num   = $result -> num_rows;

while($row = $result -> fetch_array(MYSQLI_ASSOC)){

   $cust_records[] = $row['customer_account_number'];

}

// Then for each customer record your looping through.

if(in_array($customer_record_id, $cust_records)){
    // It exists - so just update
    $update_query = "UPDATE table SET some_field = 'Some Value' WHERE customer_account_number = 1234";
    $update_result= $mysqli -> query($update_query);
}else{
    // Doesn't exist - insert
    $insert_query = "INSERT INTO table (customer_account_number) VALUES (1234)";
    $insert_result= $mysqli -> query($insert_query);
}

また、Tadman が提案したように、顧客アカウント番号が UNIQUE 列であることを確認すると、重複を追加できないように保護が追加されます。

于 2012-11-04T18:32:33.993 に答える
0

重複更新クエリで挿入を使用します。それはあなたの質問の挿入と更新の部分を行います。削除するために、私が推測する別のクエリを持つことができます。参照:http ://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

于 2012-11-04T18:36:14.233 に答える
0

MySQLは「重複キー更新時」構文をサポートしています。
これにより、基本的に、主キー(アカウント番号)がすでに存在する場合に更新するフィールドをすべて1つのSQLステートメントで指定できます。

mysql構文

このロジックはほぼ確実に顧客フィードから取得されるため、別のSQLステートメントを使用して削除を処理する必要があります。

于 2012-11-04T18:37:46.583 に答える
0

挿入する前に a を実行しSELECT id FROM table、ID をキーとして連想配列に保存します。キーが設定されているかどうかを調べるだけで、id がデータベースに存在するかどうかを確認し、それに基づいて処理を行うことができます。

各顧客プロセスを削除すると、最終的には存在しない一連の顧客が残ります。

これを 1 回実行すると、SQL 負荷がいくらか節約されます。

$result = mysql_query('SELECT id FROM table');
$ids = array();
while($row = mysql_fetch_assoc($result)){
    $ids[$row['id']] = true;
}

foreach($objects as $key => $obj) {
  if($ids[$obj['id']]) {
    // exists, update!
    unset($ids[$obj['id']]);
  } else {
    // new, insert!
  }
}

// go through the remaining people not added
for($ids as $deleted_id) {
  // delete this guy
}
于 2012-11-04T18:33:44.333 に答える