2010-07-01 98 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