使用 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
MySQL LAST_INSERT_ID() 与 INSERT INTO tablea SELECT FROM tableb
SELECT LAST_INSERT_ID() 使用准备好的语句后返回 0