在循环中插入sql查询一个好的做法还是坏的?

时间:2011-08-26 09:17:32

标签: php sql insert for-loop foreach

我有一个用户列表,需要使用foreach循环进行迭代,并插入到db表中每个新行的表中。

$data['entity_classid'] = $classid;
    $data['notification_context_id'] = $context_id;
    $data['entity_id'] = $entity_id;
    $data['notification_by'] = $userid;
    $data['actionid'] = $actionid;
    $data['is_read'] = 0;
    $data['createdtime'] = time();
    foreach($classassocusers as $users){
            $data['notification_to'] = $users->userid;
            $DB->insert_record('homework.comments',$data,false);
        }

所以使用上面给出的插入查询是

  1. 良好做法或不良做法,
  2. 我应该在每次执行插入查询后放置任何延迟吗?
  3. 这样做的利弊是什么?
  4. 由于

2 个答案:

答案 0 :(得分:8)

在您的情况下使用这样的查询是一个很好的做法。您无论如何都必须插入用户列表,因此您必须处理许多查询。没办法解决这个问题!

我不知道你为什么要在每次插入后放置一个延迟。这些方法是同步调用,因此在执行查询期间,代码将“暂停”。所以推迟它只会延迟你的代码而没有任何进展。

因此,在执行查询时,您的循环将不会继续。所以不要故意拖延你的代码。

另一种方法是执行一个查询。

$user_data = "";
foreach($classassocusers as $users) {
   $user_data .= "('" . $users->userid . "', '" . $users->name . "'), ";
}

$user_data = substr($user_data, 0, strlen($user_data) - 2);

$query = "INSERT INTO `homework.comments` ( `id`, `name` )
          VALUES " . $user_data;

那应该是这样的查询:

INSERT INTO `homework.comments` ( `id`, `name` )
VALUES ('1', 'John'),
       ('2', 'Jeffrey'),
       ('3', 'Kate');

(顺便说一下,我对你的$users对象和你的表结构做了一些假设。但我确定你理解了这个想法)

答案 1 :(得分:3)

这完全取决于您的要求。

如果您在5分钟内运行500,000次这些更新 - 每15分钟一次,您的数据库将会遇到困难。如果你每15分钟为1.000个用户执行此操作 - 这是一个很好的方法。

当要求表演时,请遵循以下内容:

  1. 使用VALUES语法组合INSERT,每500/1000处理一次。
  2. 查询后添加一个小超时。
  3. 否则,这是一个很好的方法!