2012-01-27 3 views
0
나는 FOLL 필드

150 필드 업데이트 - PHP + MYSQL 최상의 솔루션을

제품 ID, 이름, 곧 ... 150 개 필드

을 가지고 it.My의 XML 필드에 150 개 태그 (필드)가 하나 개의 XML 필드를 읽고있다

피드는 새로운 레코드 또는 업데이트되는 데이터 인 데이터를 보여줍니다.

PHP/MySQL에서 데이터를 읽고, 삽입하고, 업데이트하는 방법을 알고 있습니다.

내 관심사는 업데이트가있을 때 모든 150 개의 필드에 대해 UPDATE 문을 써야합니까? 변경된 필드 만 업데이트하는 바로 가기가 있습니까?

업데이트 이름 SET name = name을 (를) 작성하는 표준 방법입니까? 150 개 필드 모두에 대해?

또는 내가 (필드 누구가 업데이트되면) 최선의 해결책은

+2

단순히 'loop'을 사용하십시오 !! – Rikesh

+0

물론 모든 테이블 열을 UPDATE 문에 포함시키는 것은 필수 사항이 아닙니다. 어디에서 읽습니까? –

+0

어떤 데이터베이스 모델을 사용하고 있습니까? – Vyktor

답변

2

당신은 하나의 모든 150 개 필드를 업데이트 할 수있는 모든 필드를 업데이트하는 것 같아요 때문에이 작업을 수행하는 모든 스마트 솔루션,있다 질문. 당신이 한 쿼리에서 모든 150 개 필드를 업데이트 가능 여부에 대해 우려처럼

UPDATE tbl SET field1 = val1, field2 = val2, ..., fieldn = valn WHERE condition 

그것은 소리, 나는 그에 문제가 표시되지 않습니다. 또는 데이터베이스에서 튜플을 먼저 선택한 다음 각 150 개의 필드를 비교하고 데이터베이스를 업데이트해야합니다. 그것은 모든 것을 업데이트하는 것보다 훨씬 많은 작업처럼 보입니다. 그것은 두 가지 쿼리와 하나의 쿼리 대신 많은 비교입니다.

1

정확하게 알고 계시다면 귀하의 MySQL 스키마에는 150 개의 열이 있습니다. 일부 데이터베이스 모델 (예 : Zend 등),이 작업을 수행 할 수 있습니다 :

// This is just pseudocode! 
$object = $db->fetch(...); // $object is object supporting method save() 
foreach($xmlArray as $key => $value){ 
    if($object->hasProperty($key)){ 
    $object->$key = $value; 
    } else { 
    throw ... 
    } 
} 
$object->save(); 

// And internally: 
function save() { 
    $updateData = array(); 
    foreach($this->newData as $key => $val){ 
    if($this->oldData[$key] !== $val){ 
     $updateData[$key] = $val; 
    } 
    } 

    if(!count($updateData)){ 
    return false; 
    } 

    $sql = $this->updateStatement($this->table, $updateData, 'WHERE ' . $this->primaryKey . 
     ' = ' . $this->oldData[$this->primaryKey]); 
} 

을 어쨌든, 당신은 최대 MySQL의 패킷 크기가 문제가 단지 때 유용합니다. MySQL은 변경이 필요없는 컬럼을 변경하지 않습니다. 영향을받지 않는 행조차도 데이터가 변경되지 않으면 증가합니다.

xml에서로드 할 때 이미 데이터 배열이 있고 그 데이터를 추가할지 또는 업데이트할지 결정해야합니다. 그리고 당신은 이것을 할 수 있습니다 :

$updateData = $addData; 
unset($updateData['createDate']); // any field that you want to change 
$db->update('tableName', $updateData, 'condition'); 

데이터베이스 모델없이이 작업을 수행하는 것만으로도 쿼리를 생성하는 것은 좋지 않습니다. 그리고 (InnoDb를 사용할 때) 모든 업데이트/삽입을 TRANSACTION에 넣으면 응용 프로그램이 패키지 크기를 줄이려는 시도보다 훨씬 빠릅니다 (이미지, 바이너리 파일, 20KB 텍스트 등 많은 양의 데이터를 사용하지 않는다고 가정합니다)) db 엔진이 모든 인덱스를 즉시 업데이트하기 때문입니다. 나는 당신의 질문을 이해하면

-1

, 당신이 찾고있는 쿼리는 다음과 같습니다

UPDATE `table_name` SET `column1` = [value for column1] WHERE [your description of which records to change]; 

주어진 행에 하나의 필드를 업데이트합니다.

물론 1, 50, 123 및 145 열을 업데이트하려는 경우 (물론 이름을 알지 못하기 때문에 숫자를 제공하기 만합니다. 그런 다음 해당 이름을 쿼리에 포함하면됩니다. :

UPDATE `table_name` SET `column1` = [value for column1], `column50` = [value for column50], `column123` = [value for column123], `column145` = [value for column145] WHERE [your description of which records to change]; 
+0

> OP의 질문에 대답하기 위해 나를 투표 해주십시오. 그의 질문에 대한 OP가 명확하지 않다고 투표하지 않았습니다. ISHYGDDT – AdamJS