批量插入/更新PDO MySQL查询

时间:2014-04-02 13:10:39

标签: php mysql pdo

我正在为一个处理许多条目(大约30k)的Symfony2项目编写一个新函数,有许多DB托管在不同的服务器中,因此性能非常重要,为我们的应用程序增加了一些速度我们有一个没有太多数据的核心数据库,这个数据库在一个数据库中有一个缓存表,还有另一个数据库来存储所有事务。

缓存表如下所示:

+----------------+---------+------+-----+---------+----------------+
| Field          | Type    | Null | Key | Default | Extra          |
+----------------+---------+------+-----+---------+----------------+
| id             | int(11) | NO   | PRI | NULL    | auto_increment |
| object_id      | int(11) | NO   | MUL | NULL    |                |
| object_type    | int(11) | NO   |     | NULL    |                |
| sum24h         | int(11) | NO   |     | NULL    |                |
| sum3d          | int(11) | NO   |     | NULL    |                |
| sum7d          | int(11) | NO   |     | NULL    |                |
| sum30d         | int(11) | NO   |     | NULL    |                |
| sum_alltime    | int(11) | NO   |     | NULL    |                |
+----------------+---------+------+-----+---------+----------------+

它只包含数据的总和所以我想构建一个MySQL PDO查询来更新数据,或者如果条目是新的则插入它

INSERT INTO `table`
(object_id,object_type, sum24h,sum3d,sum7d,sum30d,sum_alltime)
VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?),
       (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
ON DUPLICATE KEY UPDATE object_id = ?, object_type = ?, sum24h = ?, sum3d = ?, sum7d = ?, sum30d = ?, sum_alltime = ?

因此,这适用于一个值,但在我的情况下,我想设置相应的值,例如现有值:

$data1 = array('object_id' => 1, 'object_type'=> 1,
        'sum24h' => 11101, 'sum3d' => 301, 'sum7d' => 701, 'sum30d' => 3001, 'sum_alltime' => 10001);

$data2 = array('object_id' => 2, 'object_type'=> 1,
        'sum24h' => 401, 'sum3d' => 101, 'sum7d' => 801, 'sum30d' => 1001, 'sum_alltime' => 2001);

因此,如果数据库中存在两个对象,那么可以使用单一查询来更新这两个对象吗?

PD:我会使用Doctrine来做这件事,但遗憾的是涉及的操作太多而且需要太长时间,而且我会在远程服务器上运行Cronjob脚本但是不希望这样:S

1 个答案:

答案 0 :(得分:0)

解决方案非常简单

INSERT INTO `table` (object_id,object_type,sum24h,sum3d,sum7d,sum30d,sum_alltime)
VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?),(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
ON DUPLICATE KEY UPDATE object_id = VALUES(object_id),object_type = VALUES(object_type),sum24h = VALUES(sum24h),sum3d = VALUES(sum3d),sum7d = VALUES(sum7d),sum30d = VALUES(sum30d),sum_alltime = VALUES(sum_alltime)