在我的数据库中,所有主键都是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)
)
首先我将sth插入foo,然后我需要foo_id值将相关内容插入到bar中。我可以从INFORMATION_SCHEMA.TABLES
获得此值。但是如果有人在我获得auto_increment
值之前会在foo中添加新行呢?如果所有这些步骤都在存储过程中,那么隐式启动的事务会锁定一个过程调用所需的所有资源吗?或者我可能必须明确使用START TRANSACTION
。如果我不使用过程 - 只是插入和选择序列?
答案 0 :(得分:3)
我建议您使用INFORMATION_SCHEMA.TABLE
。
LAST_INSERT_ID
来自the MySQL documentation:生成的ID是基于每个连接在服务器中维护的。这意味着函数返回给定客户端的值是为该客户端影响AUTO_INCREMENT列的最新语句生成的第一个AUTO_INCREMENT值。
这意味着在不同连接上同时执行的插入操作不会更改当前连接上返回的值。
答案 1 :(得分:0)
按以下顺序运行查询:
INSERT INTO foo (sth) VALUES ('TEST');
比:
INSERT INTO bar (foo_id) VALUES (SELECT LAST_INSERT_ID());