2012-11-04 45 views
0

我正在使用MySQL和PHP。如何在MySQL中使用额外的记录更新现有表,而不会导致重复?记录是客户,每条记录的关键是客户账号,如“1234”。如何在MySQL中添加记录而不会导致重复?

我基本上需要做三件事情。如果他们的客户帐户不存在,则添加新的客户记录,更新现有客户的信息(例如他们的电话号码或电子邮件地址已更改),或删除客户记录(如果他们不再是客户)。

数据每天都以feed的形式出现,营销人员希望拥有自己的数据库并添加自己的字段,这就是为什么我不会简单地从每日feed中重新创建数据库的原因。目标是使其与Feed保持同步。谢谢!

回答

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); 
} 

或者,你可以做一个选择查询,以获得客户的账号和数组中的弹出他们。

$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建议,如果您确保客户账户号是一个唯一列,然后,将增加额外的保护,以确保副本不能添加。

+0

调用'SELECT *'计数真的不是很酷。不要这样做。相反,请直接选择计数。 – tadman

+1

是的 - 这只是一个非常快速的例子。我会更新。 – ajtrichards

+0

计数总是返回一行。 – tadman

0

运行SELECT id FROM table,然后插入并将ID保存为关联数组中的键。只要设置了密钥,就可以检查ID是否存在于数据库中,并根据该ID进行处理。

如果您删除每个客户流程,最终您将留下一系列不再存在的客户。

执行此操作会节省一些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 
} 
0

MySQL支持“重复密钥更新”语法。
这基本上允许您指定在主键(您的帐号)已存在的情况下更新哪些字段,全部在一个SQL语句中。

mysql syntax

你不得不处理删除一个单独的SQL语句,因为这个逻辑几乎肯定会从你的顾客反馈来的。