2010-07-01 4 views
1

Я только что проверил ON DUPLICATE KEY UPDATE для MySQL.Может ли этот запрос быть более сухим?

Вот пример запроса.

$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

+0

Я не верю, что вы можете уменьшить размер запроса. Однако, используя VALUES(), вы сокращаете свое повторение, только помещая значения для записи в одно место в запросе. –

+0

@ Я хорошо, спасибо еще раз. – alex

Смежные вопросы