数据库的自动主键生成功能是否可靠?

Yat*_*oel 7 sql database

我开发了一个Web应用程序,各种客户端可以同时将记录存储到该数据库.

我已设置该数据库的自动主键生成功能,只要将新记录添加到数据库,该功能就会自动生成主键(自动注册).

所以我的问题是我可以依靠这种自动密钥生成功能吗?

如果各种用户同时存储记录会不会有问题?

Mar*_*ers 14

是的,自动增量主键是可靠的,因为永远不会生成重复键.你必须要小心你如何使用它.

  • 你不应该假设它总是会以1的增量(或你设置的任何值)增加.
  • 您不应该插入条目,然后不使用事务,期望能够选择max(id)来获取上次插入的记录的id.

  • 但是,您可以依赖于last_insert_id,因为它适用于该连接上的最后一个插入的id. (3认同)

aef*_*fxx 5

在使用MySQL的auto_inc功能时,我想补充一点:

想象一下,你有一个表employees使用auto_inc和(无论出于何种原因)第二个名为的表former_employees.让我们进一步假装每个员工都有一个独特的ID(因此auto_inc)附加给他 - 并且他甚至不会因解雇或退出而失去它.

出于业绩原因(让我们想象一下公司有几十亿员工),贵公司将前员工的记录移到同名表中.

现在这里是两个表的快照(现在不介意小ID):

employees                       former_employees
------------------------        ------------------------
id   |  name  |  ...            id   |  name  |  ...
------------------------        ------------------------
27   | Peter  |  ...            29   | Andrew |  ...
28   | Jacko  |  ...            30   | Dennis |  ...
32   | Paula  |  ...            31   | Lenny  |  ...
                                33   | JoDon  |  ...
Run Code Online (Sandbox Code Playgroud)

请注意,former_employees最后一个ID等于33,而employeesauto_inc计数器34现在等于.

如果您在此阶段关闭服务器并重新启动它,employeesauto_inc将跳回到33!那是因为MySQL没有在重启之间存储auto_inc计数器!

但请记住这一点.问候.

PS:要绕过这个"功能",你必须触发查看former_employees最后一个ID的存储过程,如果更大则设置它.

注意(S.Leske):这适用于InnoDB表,但不适用于MyISAM表.不知道其他桌面引擎.