如果我理解正确,你的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引擎会一次更新所有索引。
只需使用'loop'! – Rikesh 2012-01-27 11:16:19
当然,在UPDATE语句中包含所有表列并不是强制性的,您是在哪里阅读的? – 2012-01-27 11:16:55
你正在使用什么数据库模型? – Vyktor 2012-01-27 11:18:21