如何一次处理多个插入

时间:2011-03-23 01:56:21

标签: mysql transactions locking

我需要一次运行多个查询。下面你可以看到一个例子。 如何确保在表A上插入并在变量上存储最后一个插入ID之后,如果同时发生另一个插入,那么它将在其他表上插入正确的值吗?我是否必须锁定所有表,运行查询然后解锁表?我读了一些关于交易的事情我需要它们吗? 谢谢你的任何建议。

create table a (
id int not null auto_increment primary key,
name varchar(10)
) engine = innodb;

create table b (
id int not null auto_increment primary key,
id_a int
) engine innodb;

create table c (
id int not null auto_increment primary key,
id_a int)
engine innodb;

insert into a (name) values ('something');
set @last_id = last_insert_id();
insert into b (id_a) values (@last_id);
insert into c (id_a) values (@last_id);

3 个答案:

答案 0 :(得分:2)

按此顺序

insert into a (name) values ('something');
set @last_id = last_insert_id();
insert into b (id_a) values (@last_id);
insert into c (id_a) values (@last_id);

变量@last_id是全局变量,但对您的特定会话而言是唯一的。因此,一旦设置,除非您再次更改,否则该值不会更改。

至于last_insert_id(),特别是manual个状态

  

生成的ID基于每个连接在服务器中维护。

所以其他连接的作用并不重要。 bc中的插入内容保证使用为a生成的ID。

答案 1 :(得分:1)

根据MySQL documentation last_insert_id()仅适用于当前会话。

  

生成的ID是   维护在服务器上   每个连接基础。这意味着   函数返回的值   给定的客户是第一个   生成的AUTO_INCREMENT值   最近的声明影响了   该客户端的AUTO_INCREMENT列。   此值不受其他人的影响   客户,即使他们产生   自己的AUTO_INCREMENT值。   此行为可确保每个客户端   无需检索自己的ID   关心他人的活动   客户,而不需要   锁或交易。

答案 2 :(得分:1)

如果我这样做,我可能会打开一个transaction作为引用http://dev.mysql.com/doc/refman/5.0/en/commit.html

如果您使用的是CodeIgniter之类的框架,您可以访问以类似方式工作的数据库抽象层,例如http://codeigniter.com/user_guide/database/transactions.html