我需要一次运行多个查询。下面你可以看到一个例子。 如何确保在表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);
答案 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基于每个连接在服务器中维护。
所以其他连接的作用并不重要。 b
和c
中的插入内容保证使用为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