2010-07-01 79 views
1

我刚刚检查了MySQL的ON DUPLICATE KEY UPDATE这个查询可以再干吗?

这是一个示例查询。

$query = 'INSERT INTO `activities` 
        (`id`, 
        `hole_id`, 
        `name_id`, 
        `start_depth`, 
        `end_depth`, 
        `start_time`, 
        `end_time` 
       ) VALUES (
       :id, 
       :hole_id, 
       :name_id, 
       :start_depth, 
       :end_depth, 
       :start_time, 
       :end_time 
      ) ON DUPLICATE KEY UPDATE 
       `id` = :id, 
       `hole_id` = :hole_id, 
       `name_id` = :name_id, 
       `start_depth` = :start_depth, 
       `end_depth` = :end_depth, 
       `start_time` = :start_time, 
       `end_time` = :end_time 
      '; 

显然有很多重复。

有没有办法说“插入,或者如果存在使用现有的信息来更新”。

我看过REPLACE,它说它插入和删除,如果需要的话。文档说插入或更新使用我上面使用的方法。

所以我可以消除所有更新信息的翻倍?

回答

3

您可以使用VALUES()函数来引用列的值,而不是重复ON DUPLICATE KEY部分中的值。参见:http://dev.mysql.com/doc/refman/5.1/en/miscellaneous-functions.html#function_values

例如:

$query = 'INSERT INTO `activities` 
       (`id`, 
       `hole_id`, 
       `name_id`, 
       `start_depth`, 
       `end_depth`, 
       `start_time`, 
       `end_time` 
      ) VALUES (
      :id, 
      :hole_id, 
      :name_id, 
      :start_depth, 
      :end_depth, 
      :start_time, 
      :end_time 
     ) ON DUPLICATE KEY UPDATE 
      `id` = VALUES(id), 
      `hole_id` = VALUES(hole_id), 
      `name_id` = VALUES(name_id), 
      `start_depth` = VALUES(start_depth), 
      `end_depth` = VALUES(end_depth), 
      `start_time` = VALUES(start_time), 
      `end_time` = VALUES(end_time) 
     '; 
+0

有趣,我很欣赏你的答案,但它仍然看起来同样数量的SQL。理想情况下,我想要一半。但是我意识到SQL抽象有时会让生活变得困难。 +1 – alex 2010-07-01 02:05:01

+0

我不相信你可以减少查询的大小。但是,通过使用VALUES(),您只需将查询中的记录值放入查询中即可减少重复次数。 – 2010-07-01 02:07:07

+0

@Imm好的,再次感谢你。 – alex 2010-07-01 02:13:14