2012-01-27 78 views
0

我读它有150个标签(场)在it.My XML领域拥有FOLL领域150场更新 - PHP + MySQL的最佳解决方案

产品ID,姓名,很快... 150场

一个XML场

这些提要向我显示的数据是新记录或更新的数据。

我知道怎么读,插入,在PHP/MySQL的更新数据。

我主要担心的是,当有更新,我是否必须写UPDATE语句对所有150场?有没有更新只更新已更改的字段的快捷方式?

是它的标准方法来写更新名称设置名称= name,其中...为所有150场?

还是有这样做的任何聪明的解决方案,因为我不认为它最佳的解决方案,以更新的所有字段(如果该字段的任何更新)

+2

只需使用'loop'! – Rikesh 2012-01-27 11:16:19

+0

当然,在UPDATE语句中包含所有表列并不是强制性的,您是在哪里阅读的? – 2012-01-27 11:16:55

+0

你正在使用什么数据库模型? – Vyktor 2012-01-27 11:18:21

回答

2

你可以只用一个更新的所有150场查询。

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

这听起来像你担心它是否可行更新所有150场在一个查询,我不觉得这有一个问题。或者,您必须首先从数据库中选择元组,然后比较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文本等on),因为db引擎会一次更新所有索引。

-1

如果我理解你的问题,你要寻找的查询是:

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

任何给定的行仅更新一个字段。

如果您想更新,比方说,50列1,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 2012-01-27 13:45:02