【问题标题】:Inserting multiple rows in mysql在mysql中插入多行
【发布时间】:2011-10-16 20:57:19
【问题描述】:

如果我一次插入多行,数据库查询是否更快:

喜欢

INSERT....

UNION

INSERT....

UNION

(我需要插入 2-3000 行)

【问题讨论】:

标签: mysql sql-insert


【解决方案1】:
// db table name / blog_post / menu /  site_title
// Insert into Table (column names separated with comma)
$sql = "INSERT INTO product_cate (site_title, sub_title) 
  VALUES ('$site_title', '$sub_title')";

// db table name / blog_post / menu /  site_title
// Insert into Table (column names separated with comma)
$sql = "INSERT INTO menu (menu_title, sub_menu)
  VALUES ('$menu_title', '$sub_menu', )";

// db table name / blog_post /  menu /  site_title
// Insert into Table (column names separated with comma)
$sql = "INSERT INTO blog_post (post_title, post_des, post_img)
  VALUES ('$post_title ', '$post_des', '$post_img')";

【讨论】:

  • 除了此响应的混乱之外,假设您使用的是 PHP,您还可能容易受到 SQL 注入的影响。
  • 1.您的 SQL 代码中存在错误。 2. 下一个 $sql 值将替换之前的 $sql 值。
  • 给未来读者的小提示,这是一个非常容易犯的错误,尤其是对于新手来说,永远不要在 sql 查询中插入原始字符串,我们网站的用户可以进行相当讨厌的攻击调用随机查询,更多信息owasp.org/www-community/attacks/SQL_Injection 大多数库将具有消毒功能,可将变量编辑为不会中断和转义引号的安全形式
【解决方案2】:

如果您将数据保存在文本文件中,您可以使用LOAD DATA INFILE

从文本文件加载表时,使用 LOAD DATA INFILE。这通常比使用 INSERT 语句快 20 倍。

Optimizing INSERT Statements

您可以在上面的链接中找到有关如何加快插入语句的更多提示。

【讨论】:

  • 重复记录怎么办?
  • @Matteo Duplicates 将根据您定义的架构被数据库插入或拒绝。
  • 使用mysql多查询
  • 第二个链接 404.
  • 断开的链接“插入语句的速度”现在包含在:Optimizing INSERT Statements
【解决方案3】:

这是一个可用于 n:m(多对多关系)表的 PHP 解决方案:

// get data
$table_1 = get_table_1_rows();
$table_2_fk_id = 123;

// prepare first part of the query (before values)
$query = "INSERT INTO `table` (
   `table_1_fk_id`,
   `table_2_fk_id`,
   `insert_date`
) VALUES ";

//loop the table 1 to get all foreign keys and put it in array
foreach($table_1 as $row) {
    $query_values[] = "(".$row["table_1_pk_id"].", $table_2_fk_id, NOW())";
}

// Implode the query values array with a coma and execute the query.
$db->query($query . implode(',',$query_values));

【讨论】:

  • 使用 implode() 确实规避了“最后一个字符”问题,但它会产生巨大的内存开销。她要求 3000 行,想象每行有 1kb 的数据,这已经是 3MB 的原始数据。该数组将占用 30MB 的内存,她已经从 $table_1 消耗了另外 30MB,因此脚本将使用 60MB。就这么说吧,不然也挺好的解决办法
  • 对我的情况很有用。
【解决方案4】:
BEGIN;
INSERT INTO test_b (price_sum)
  SELECT price
  FROM   test_a;
INSERT INTO test_c (price_summ) 
  SELECT price
FROM   test_a;
COMMIT;

【讨论】:

  • 这值得更多的支持,使用它你可以批量插入从其他表检索到的数据
  • 如果对这段代码中发生的事情有解释就好了,因为我必须“批量插入从其他表中检索到的数据”...
【解决方案5】:

INSERT 使用VALUES 语法的语句可以插入多行。为此,请包含多个列值列表,每个列表括在括号中并用逗号分隔。

示例:

INSERT INTO tbl_name
    (a,b,c)
VALUES
    (1,2,3),
    (4,5,6),
    (7,8,9);

Source

【讨论】:

  • @RPK。我同意你的看法,但我不知道她的数据来源。正如我已经写过的,如果她有一个文件,我会按照 cularis 的建议使用加载数据语法。 :)
  • 也可以使用INSERT INTO Table SELECT 1, '14/05/2012', 3 UNION SELECT 2, '05/14/2012', 3。当然,这只会更好地插入来自不同表的值。
  • 有用的参考,因为有时我只是忘记了简单的语法。
  • 这里是a、b、c的临时变量存储行的内容吗?
  • @Lealo 不,它们是以相同顺序插入值的表列名称。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-29
相关资源
最近更新 更多