这个查询可以更干吗?

时间:2010-07-01 01:47:50

标签: sql mysql dry

我刚刚查看了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,并说它会在必要时插入和删除。文档说插入或更新以使用我上面使用的方法。

那么我可以消除所有更新信息的倍增吗?

1 个答案:

答案 0 :(得分: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)
        ';