在我的数据库中,所有主键都是surogate . 有一些唯一键,但并非总是如此,因此访问特定行的最安全方法是主键 . 他们中的许多人使用AUTO_INCREMENT . 插入两个相关表时是否必须锁定对数据库的访问?例如 .
create table foo
(
foo_id numeric not null auto_increment,
sth varchar,
PRIMARY KEY(foo_id)
)
create table bar
(
bar_id numeric not null auto_increment,
foo_id numeric not null,
PRIMARY KEY(bar_id),
FOREIGN KEY (foo_id) REFERENCES foo(foo_id)
)
首先我插入到foo,然后我需要foo_id值将相关的东西插入到bar中 . 这个值我可以从 INFORMATION_SCHEMA.TABLES
获得 . 但是如果有人在我获得 auto_increment
值之前会在foo中添加新行呢?如果所有这些步骤都在存储过程中,那么隐式启动的事务会锁定一个过程调用所需的所有资源吗?或许我必须明确使用 START TRANSACTION
. 如果我不使用过程 - 只是插入和选择序列怎么办?
2 回答
我建议您使用
LAST_INSERT_ID
,而不是查看INFORMATION_SCHEMA.TABLE
.从the MySQL documentation:生成的ID在每个连接的基础上在服务器中维护 . 这意味着函数返回给定客户端的值是为该客户端影响AUTO_INCREMENT列的最新语句生成的第一个AUTO_INCREMENT值 .
这意味着在不同连接上同时执行的插入不会更改当前连接上返回的值 .
按以下顺序运行查询:
比: