在我虚构的数据库中,我有几列数据。在设计脚本的PHP前端时,必须允许用户在必要时修改元组的所有属性。
如果最终用户最终只修改了一个属性而不是所有属性,则使用以下语句:
UPDATE foo
SET name='bar' location='YYZ' drink='ale'
where user='smithj'`
将更新元组“smithj”的所有三个属性,即使其中两个属性相同。
有没有办法让SQL(MySQL,如果它有所作为)自动过滤掉冗余更新,类似于IF EXISTS
中的CREATE TABLE IF EXISTS
子句?
谢谢!
答案 0 :(得分:1)
就此而言,您个人最有可能尝试进行预成熟优化。更新三个值以使它们成为需要的就好了。
检查要更新的内容最有可能花费更多。
答案 1 :(得分:1)
要回答的第一个问题是为什么?
我看到的唯一原因是表现。但性能挑战可能有两个原因:
在您的应用程序和数据库之间移动数据。您可以通过仅包含update语句中实际需要更新的列来减少这种情况。但是,当我们谈论三个专栏时,这是很多工作,可能不值得。另请注意,此创建的大量不同的sql语句可能会导致某些数据库内部缓存。我不知道MySQL是否属实,但它适用于oracle。 (假设您使用绑定变量(您应该使用))
并实际操作数据库中的数据。但是在那个阶段,找到要更新的记录(where子句)比实际更新它要昂贵得多。而且我猜这就是没有任何功能的原因,当旧的和新的值实际上是相同的时候会改变更新
答案 2 :(得分:1)
“如果您将列设置为当前的值,MySQL会注意到这一点并且不会更新它。”
答案 3 :(得分:0)
您需要在代码中执行此操作。在任何情况下,您提供的“示例”查询都会对SQL injection:}
发出呼喊使用参数化查询,即时构建它们,并仅添加要更新的项目。
答案 4 :(得分:0)
与Sunny建议的一致,你必须参数化你的查询。
一个选项可能是这个(在高级伪代码中): 当用户编辑项目时(比如说在keyPress上),您可以标记该单元格。 您可以从每个标记的单元格中获取值,并仅将它们的值传递给参数化查询。
然而,这很难过,除非你有大量的行,否则不应该对你的表现造成太大的影响。