1

在我虚构的数据库中,我有几列数据。在设计脚本的 PHP 前端时,有必要允许用户在必要时修改元组的所有属性。

如果最终用户最终只修改了一个属性而不是所有属性,则以下语句:

UPDATE foo 
   SET name='bar' location='YYZ' drink='ale' 
 where user='smithj'`

将更新元组“smithj”的所有三个属性,即使其中两个属性相同。

有没有办法让 SQL(MySQL,如果有区别的话)自动过滤掉冗余更新,类似于中的IF EXISTS子句CREATE TABLE IF EXISTS

谢谢!

4

5 回答 5

1

就个人而言,此时您最有可能尝试进行未成熟的优化。更新这三个值以使它们成为所需的值会很好。

检查以查看要更新的内容很可能会花费更多。

于 2010-02-04T22:34:59.947 回答
1

首先要回答的问题是为什么?

我看到的唯一原因是性能。但性能挑战可能有两个原因:

  • 在应用程序和数据库之间移动数据。您可以通过仅在更新语句中包含实际需要更新的列来减少这种情况。但是当我们谈论三个专栏时,这是很多工作并且可能不值得。另请注意,这创建的大量不同的 sql 语句可能会杀死一些数据库内部缓存。我不知道这是否适用于 MySQL,但它适用于 oracle。(假设您使用绑定变量(您应该这样做))

  • 并实际操作数据库中的数据。但是在那个阶段,找到要更新的记录(where 子句)比实际更新它的成本要高得多。我想这就是为什么没有任何功能可以更新旧值和新值实际上相同的原因

于 2010-02-04T22:36:34.823 回答
1

“如果你将一列设置为它当前的值,MySQL 会注意到这一点并且不会更新它。”

http://dev.mysql.com/doc/refman/5.0/en/update.html

于 2010-02-04T22:37:24.527 回答
0

您需要在代码中执行此操作。无论如何,您提供的“示例”查询要求SQL 注入:)

使用参数化查询,即时构建它们,并仅添加您要更新的项目。

于 2010-02-04T22:33:14.040 回答
0

按照 Sunny 的建议,您必须对查询进行参数化。

一个选项可能是这样的(在高级伪代码中):当用户编辑一个项目时(比如说在 keyPress 上),您可以标记该单元格。您可以从每个标记的单元格中获取值,并且只将它们的值传递给您的参数化查询。

然而,这很可悲,除非你有大量的行,否则它不应该对你的表现产生太大的影响。

于 2010-02-04T22:37:14.483 回答