2010-02-04 75 views
1

在我的虚构数据库中,我有几列数据。在设计脚本的PHP前端时,必要时允许用户修改元组的所有属性。用于优化UPDATE查询的SQL子句?

如果最终用户只结束了修改一个属性,而不是所有的人,下面的语句:

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

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

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

谢谢!

回答

0

您需要在代码中执行此操作。在任何情况下,您提供的示例查询SQL injection :)

使用参数化查询,动态构建它们,并只添加您想要更新的项目。

+0

最绝的!为了演示,示例代码是好的,但没错,一定安全隐患存在。 – 2010-02-04 22:51:04

1

就个人而言,您最有可能在此时尝试进行预先优化。更新三个值,使他们成为他们需要的东西就会很好。

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

1

要回答的第一个问题是为什么?

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

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

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

0

什么阳光建议一起去,你必须参数化查询。

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

然而,这是令人悲伤的,除非你有很多行,它不应该对你的表现有很大的不同。