2012-11-04 6 views
0

나는 MySQL과 PHP에서 일하고있다. MySQL에서 중복을 일으키지 않고 추가 레코드가있는 기존 테이블을 어떻게 업데이트합니까? 레코드는 고객이고 각 레코드의 키는 "1234"와 같은 고객 계정 번호입니다.MySQL에서 중복을 일으키지 않고 레코드를 추가하는 방법은 무엇입니까?

기본적으로 세 가지 작업을 수행해야합니다. 고객 계정이없는 경우 새 고객 레코드를 추가하고 전화 번호 나 전자 메일 주소가 변경된 것과 같은 기존 고객의 정보를 업데이트하거나 더 이상 고객이 아닐 경우 고객 레코드를 삭제하십시오.

데이터는 매일 피드로 제공되며 마케팅은 자체 필드가 ​​추가 된 고객의 자체 데이터베이스를 갖고 싶어하므로 일일 피드에서 데이터베이스를 다시 작성하는 것이 아닙니다. 목표는 피드를 최신 상태로 유지하는 것입니다. 감사!

답변

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

을 다른 방법으로, 고객의 계좌 번호를 얻을 수 및 배열에서 그들을 팝업 하나 개 선택 쿼리를 할 수 있습니다. 당신이 고객의 계좌 번호가 있는지 중복을 추가 할 수 있도록 여분의 보호를 추가합니다 다음 UNIQUE 컬럼 있는지 확인하는 경우, Tadman에 의해 제안 또한

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

.

+0

셀 수에 대해'SELECT *'를 호출하는 것은 정말로 좋지 않습니다. 이러지 마. 대신 직접 계산을 선택하십시오. – tadman

+1

예 - 정말 빠른 예였습니다. 나는 갱신 할 것이다. – ajtrichards

+0

Count는 항상 한 행을 반환합니다. – tadman

0

id를 삽입하여 연관 배열에 키로 저장하기 전에 SELECT id FROM table을 실행하십시오. 단순히 키가 설정되면 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 문을 사용하여 삭제를 처리해야 할 것이다.

관련 문제