使用Mysql对链接表执行多个INSERT

时间:2012-04-09 15:08:50

标签: mysql stored-procedures insert last-insert-id

我有两个表,一个链接到另一个的主键。目前我插入表A,获取LAST_INSERT_ID,然后INSERT到表B中。

但我要插入数百条记录,我想加快速度。

在Mysql中你可以:

INSERT INTO table_a (v1, v2, c3) VALUE (0, 1, 2);

INSERT INTO table_a (v1, v2, v3) VALUE (4, 5, 6); 

等,或

INSERT INTO table_a (v1, v2, v3) VALUE (0, 1, 2), (4, 5, 6), etc可以更快地添加多个条目 - 但仅限于一个表。

当然后者要快得多。我想知道是否有可能使用存储过程为两个链接表复制此行为,以及它是否会在性能上有类似的显着改进:

类似于:调用special_insert((0,1,2),(4,5,6)等);或类似的。

我没有存储过程的经验,因此我会在哪个方向继续学习。

2 个答案:

答案 0 :(得分:8)

以下是包含Last_Insert_ID()的两个表插入的存储过程示例。

DELIMITER //
CREATE PROCEDURE new_person(
  first CHAR(35), last CHAR(35), email CHAR(255), tool_id INT)
BEGIN
START TRANSACTION;
   INSERT INTO person(firstname, lastname, email) 
     VALUES(first, last, email);

   INSERT INTO tasks (engineer_id, tool_id) 
     VALUES(LAST_INSERT_ID(), tool_id);
COMMIT;
END//
DELIMITER ;

CALL new_person('Jerry', 'Fernholz', 'me@somewhere.com', 1);

答案 1 :(得分:1)

经过一些进一步调查后,似乎SP不会提供显着的速度提升,也无法接受INSERT INTO等批量参数

MySQL Stored Procedure vs. complex query

但是我仍然需要在一个中插入相当多的链接记录,所以我做了以下内容:

插入(x,y)值(1,2),(3,4),(5,6),...(N-1,N)

id = GET_LAST INSERT_ID

只要我们使用InnoDB表,

ids的范围从id到id + N:

MySQL LAST_INSERT_ID() used with multiple records INSERT statement

MySQL LAST_INSERT_ID() used with multiple records INSERT statement

http://gtowey.blogspot.com/2012/02/multi-insert-and-lastinsertid.html

然后

INSERT INTO b(a_id,z)VALUES(id,2),(id + 1,4),(id + 2,6),...(id + N,11) 只有你需要知道你复制的mysql增量增量。