我正在使用 MySQL 和 PHP。在 MySQL 中,您如何使用附加记录对现有表进行更新,而不会导致重复?记录是客户,每条记录的关键是客户帐号,例如“1234”。
我基本上需要做三件事。如果客户帐户不存在,则添加新客户记录,更新现有客户的电话号码或电子邮件地址等信息,如果他们不再是客户,则删除客户记录。
数据每天都以提要的形式出现,营销部门希望拥有自己的客户数据库,并添加自己的字段,这就是为什么我不简单地从每日提要重新创建数据库的原因。目标是使其与提要保持同步。谢谢!
我建议您使用 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 所建议的,如果您确保客户帐号是唯一列,那么这将增加额外的保护以确保无法添加重复项。
在插入之前运行 aSELECT id FROM table
并将 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
}
在重复更新查询上使用插入。它执行您问题的插入和更新部分。对于删除,我想你可以有另一个查询。参考:http ://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html
MySQL 支持“on duplicate key update”语法。
这基本上允许您在一个 SQL 语句中指定如果主键(您的帐号)已经存在,则更新哪些字段。
您必须使用单独的 SQL 语句来处理删除,因为该逻辑几乎肯定来自您的客户提要。