使用 select last_insert_id 生成唯一 ID

Posted

技术标签:

【中文标题】使用 select last_insert_id 生成唯一 ID【英文标题】:Using select last_insert_id to generate unique ids 【发布时间】:2012-09-03 23:01:50 【问题描述】:

在阅读 *** 上的可能选项后,我没有看到我正在考虑的确切情况的答案...

案例:我有一个自动生成 mysql 连接模板的 php 系统。

为了使系统正常工作,我需要每个生成的模板在创建时分配一个唯一的 6 位整数。而不是弄乱随机化器等......

A) 我可以简单地在数据库中创建一个名为“pageid”的表,使用 int(11) / unique / autoincrement 起始值为 100000,然后在模板创建过程中,只需在该表上执行插入操作,然后然后一个'select last_insert_id()'来提取最后一个值,然后在创建模板时将其注入到模板中? (换句话说,该表的唯一功能是生成并返回最后一个唯一 id)。

B) 如果是这样,我应该担心使用这种方法有什么问题吗? (除了这意味着只能生成 899,999 个模板的限制——在这种情况下这不是问题)。

任何想法或更好的方法表示赞赏......

【问题讨论】:

【参考方案1】:

    我是否可以简单地在数据库中创建一个名为“pageid”的表,int(11) / unique / autoincrement 起始值为 100000,然后在模板创建过程中,只需在此表上执行插入,然后'select last_insert_id()' 提取最后一个值,然后在创建模板时将其注入到模板中? (换句话说,该表的唯一功能是生成并返回最后一个唯一 id)。

    是的:

    CREATE TABLE pages (
      pageid MEDIUMINT(6) NOT NULL AUTO_INCREMENT PRIMARY KEY
    ) AUTO_INCREMENT = 100000;
    

    请注意,我使用的是 MEDIUMINT(6),因为它比 INT 需要的存储空间少 1 个字节,并且显示宽度更适合您的需求。

    如果是这样,使用这种方法有什么我需要注意的问题吗? (除了这意味着只能生成 899,999 个模板的限制——在这种情况下这不是问题)。

    您可以改为在 templates 表中保留该列,并在插入新记录时自动分配 id

【讨论】:

(不小心按回车键)...对于#2,它是一个独特的系统,因为数据库条目是在模板创建之后从模板创建的 - 所以这就是为什么单独的表更适合这个案例。对于#1,因为我以前没有为此目的使用过表,有没有比拥有唯一 id 和任意列更好的方法,我在其中插入任意数据,只是为了 +1 的目的自动递增?谢谢 @Soyo:您不需要任意列:使用我上面的示例,您需要做的就是INSERT INTO pages VALUES (NULL)

以上是关于使用 select last_insert_id 生成唯一 ID的主要内容,如果未能解决你的问题,请参考以下文章

使用 select last_insert_id 生成唯一 ID

SELECT LAST_INSERT_ID() *更新

MySQL LAST_INSERT_ID() 与 INSERT INTO tablea SELECT FROM tableb

SELECT LAST_INSERT_ID() 使用准备好的语句后返回 0

在Spring中用select last_insert_id()时遇到问题

后跟 SELECT LAST_INSERT_ID 时 INSERT 不起作用