Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
150字段更新-PHP+MYsql最佳解决方案_Php_Mysql - Fatal编程技术网

150字段更新-PHP+MYsql最佳解决方案

150字段更新-PHP+MYsql最佳解决方案,php,mysql,Php,Mysql,我正在阅读一个XML字段,其中包含150个标记字段 productid、名称等。。。150个字段 feed向我显示的数据要么是新记录,要么是更新的数据 我知道如何在PHP/Mysql中读取、插入和更新数据 我主要关心的是,当有更新时,我是否必须为所有150个字段编写UPDATE语句?是否有只更新已更改字段的快捷方式 这是写入更新名称SET name=name的标准方法吗,其中。。。对于所有150个字段 或者有什么聪明的解决方案可以做到这一点,因为我不认为更新所有字段是最好的解决方案。如果字段中的

我正在阅读一个XML字段,其中包含150个标记字段

productid、名称等。。。150个字段

feed向我显示的数据要么是新记录,要么是更新的数据

我知道如何在PHP/Mysql中读取、插入和更新数据

我主要关心的是,当有更新时,我是否必须为所有150个字段编写UPDATE语句?是否有只更新已更改字段的快捷方式

这是写入更新名称SET name=name的标准方法吗,其中。。。对于所有150个字段


或者有什么聪明的解决方案可以做到这一点,因为我不认为更新所有字段是最好的解决方案。如果字段中的任何一个字段被更新了,您只需一个查询就可以更新所有150个字段

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

听起来您关心的是在一个查询中更新所有150个字段是否可行,我不认为这有什么问题。或者,您必须首先从数据库中选择元组,然后比较150个字段中的每个字段,并更新数据库。这似乎比更新所有东西都需要做更多的工作。这是两个查询和大量比较,而不是一个查询。

如果我理解正确,您的mysql方案有150列。某些数据库模型(如)允许您执行以下操作:

UPDATE tbl SET field1 = val1, field2 = val2, ..., fieldn = valn WHERE condition
//这只是伪代码! $object=$db->fetch…;//$对象是支持保存方法的对象 foreach$xmlArray作为$key=>$value{ 如果$object->hasProperty$key{ $object->$key=$value; }否则{ 投 } } $object->save; //内部: 函数保存{ $updateData=数组; foreach$this->newData as$key=>$val{ 如果$this->oldData[$key]!==$val{ $updateData[$key]=$val; } } 如果!计数$updateData{ 返回false; } $sql=$this->updateStatement$this->table,$updateData,'WHERE'.$this->primaryKey。 “=”.$this->oldData[$this->primaryKey]; } 无论如何,当您遇到最大mysql数据包大小的问题时,这非常有用。Mysql不会更改不需要更改的列。没有数据更改时,甚至不会增加受影响的行

我猜当您从xml加载数据并决定是添加还是更新它们时,您已经在某种数组中拥有了数据。你可以这样做:

$updateData=$addData; 取消设置$updateData['createDate'];//要更改的任何字段 $db->update'tableName',$updateData'condition';
在没有数据库模型的情况下这样做,仅仅通过生成查询是不好的解决方案。使用InnoDb时,将所有更新/插入放入事务将使您的应用程序比任何减少包大小的尝试都要快得多。我假设您没有使用大量数据,如图像、二进制文件、20KB文本等,因为db引擎将一次更新所有索引。

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

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];

当然,在UPDATE语句中包含所有表列不是强制性的,您是在哪里读到的?您使用的是什么数据库模型?UPDATE语句中不强制包含所有表列,因此我如何知道只有一个字段内容被更新,因为XML将被循环读入。如果字段相同,则无论如何都不会更新。mySQL解决了这个问题。还可以尝试使用重复密钥更新时插入来节省额外的插入。“替换”等同于“重复密钥更新时插入”,但无论使用哪种方法,请确保已正确定义主键/唯一键。>回答OP问题时否决我>问题不清楚时不否决OP。伊希格滴特