在mysql数据库中插入大量迭代行

时间:2014-07-30 11:59:30

标签: php mysql

我需要将批量数据添加到我的表'wp_usermeta'。数据是相同的,但每行只更改user_id。一个PHP示例是:

for($i = 1; $i < 10000; $i++){
    mysql_query(
        "INSERT INTO wp_usermeta ('user_id', 'meta_key', 'meta_value') 
         VALUES ($i, "key", "value")");
}

所以我为最多10,000个用户的每个用户添加一行,除了从迭代变量中获取的user_id之外,这是完全相同的。

有没有办法在mysql中更有效地做到这一点?

4 个答案:

答案 0 :(得分:2)

这将在一个SQL语句中执行:

$sql="
  INSERT INTO wp_usermeta ('user_id', 'meta_key', 'meta_value') 
  VALUES 
";

for($i = 1; $i < 10000; $i++){
  $sql.="($i, 'key', 'value'),";
}

$sql=rtrim($sql, ",");

请不要使用已弃用的mysql_函数,而是使用mysqli_PDO

答案 1 :(得分:1)

没有办法避免每行的INSERT语句,但是,如果你一次完成所有这些(在单个查询中),它将比单独执行它们更快:

INSERT INTO wp_usermeta (user_id, meta_key, meta_value) 
 VALUES (1, 'key', 'value'),
 VALUES (2, 'key', 'value'),
 ...
 VALUES (10000, 'key', 'value');
每次查询完成后,MySQL都会更新索引。这是一个查询,因此仅在插入所有行后才更新索引。

即使单独执行插入操作,但使用预准备语句和绑定参数,也会比当前方法更快。

答案 2 :(得分:0)

试试此代码

<?php
    $query = "INSERT INTO wp_usermeta ('user_id', 'meta_key', 'meta_value') VALUES ";
    $user_details = array();
    for($i = 1; $i < 10000; $i++){
        $user_details[] = "(".$i.",'key','value')";
    }
    $query .= implode(",", $user_details);
    mysql_query($query);
?>

答案 3 :(得分:0)

你可以用这句话来做:

INSERT INTO wp_usermeta (user_id, meta_key, meta_value)
SELECT
    nums.n, 'key', 'value'
FROM (
    SELECT 
        a.N + b.N * 10 + c.N * 100 + +d.N * 1000 + 1 AS n
    FROM
        (SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a
       ,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b
       ,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) c
       ,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) d
    ORDER BY n
) nums;

<强>解释

内部选择构建数字从1到10.000

<强> Demo