在mysql中插入多行


349

如果一次插入多行,数据库查询会更快吗:

喜欢

INSERT....

UNION

INSERT....

UNION

(我需要插入2-3000行)


8
UNION用于选择。
雅各布

1
行如何来?您是在MySQL查询浏览器上直接编写SQL还是在PHP或C#或其他工具中使用SQL。如果适合后一种情况,请检查以下链接:插入100k记录的最快方法 多行快速插入
RKh 2011年

Answers:


1176

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

例:

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

资源


@RPK。我同意您的意见,但我不知道她的数据来源。正如我已经写过的,如果她有文件,我将使用cularis建议的加载数据语法。:)
Nicola Cossu 2011年

也可以使用INSERT INTO Table SELECT 1, '14/05/2012', 3 UNION SELECT 2, '05/14/2012', 3。当然,这只会更好,因为插入的值来自不同的表。
Zohar Peled

72
有用的参考,因为有时我只是忘记了简单的语法。
Captain Hypertext

这里的a,b和c是存储行内容的临时变量吗?
Lealo '17

3
@Lealo不,它们是以相同顺序插入值的表列名称。
BeetleJuice

60

如果您的数据在文本文件中,则可以使用LOAD DATA INFILE

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

优化INSERT语句

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


3
重复的记录呢?
Matteo

2
@Matteo重复项将根据您定义的模式被数据库插入或拒绝。
ankush981

使用mysql多查询-Francisco
Yepes Barrera,

1
第二个链接
404。– dimir

1
断开链接“插入语句的速度”现在包含在:优化INSERT语句中
肯尼思·科拉诺

27
BEGIN;
INSERT INTO test_b (price_sum)
  SELECT price
  FROM   test_a;
INSERT INTO test_c (price_summ) 
  SELECT price
FROM   test_a;
COMMIT;

3
这值得更多的投票,使用它您可以批量插入从其他表中检索的数据
Novastorm

4
考虑到我必须“大量插入从其他表中检索到的数据”,如果只对这段代码中发生的事情有一个解释……
Aleister Tanek Javas Mraz 19'Aug

0

这是一个可与:: 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。只是说,否则,这是一个很好的解决方案
约翰·约翰·

这对我的情况很有用。
Bilalatimşek

-11
// 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注入的攻击。
ultrafez

2
1.您的SQL代码中有错误。2.下一个$ sql值将替换先前的$ sql值。
Marwan Salim
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.