【问题标题】:Inserting into two MySQL related tables with surogate primary keys使用代理主键插入两个 MySQL 相关表
【发布时间】:2015-12-26 13:28:18
【问题描述】:

在我的数据库中,所有主键都是代理。有一些唯一键,但并非总是如此,因此访问特定行的最安全方法是主键。他们中的许多人使用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。如果我不使用过程 - 只是插入和选择序列怎么办?

【问题讨论】:

    标签: mysql database


    【解决方案1】:

    建议您使用LAST_INSERT_ID,而不是查看INFORMATION_SCHEMA.TABLE

    来自the MySQL documentation生成的 ID 在服务器中基于每个连接进行维护。这意味着函数返回给给定客户端的值是为影响该客户端的 AUTO_INCREMENT 列的最新语句生成的第一个 AUTO_INCREMENT 值。

    这意味着在不同连接上同时完成的插入操作不会更改当前连接上返回的值。

    【讨论】:

    • 同意这样使用 INSERT INTO bar (foo_id) VALUES (SELECT LAST_INSERT_ID())
    【解决方案2】:

    按该顺序运行查询:

    INSERT INTO foo (sth) VALUES ('TEST');
    

    比:

    INSERT INTO bar (foo_id) VALUES (SELECT LAST_INSERT_ID());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-09
      • 2015-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多