数据库中使用字符串组合自动递增表ID

7
我们知道表的id是整型且自增的,但我的问题是我想要一个由字符串和整数组成的唯一标识符。例如,字符串ABC是唯一标识符的起始码。
我的表的第一个id应该是主键,即ABC10001,ABC10002等等。
请不要使用另一个自增键来实现,并且不要使用两种类型的唯一键。

为什么主键需要前缀?在查询或显示时,不能在应用程序层中添加吗? - Marcelo Cantos
这看起来非常类似于这个问题:如何在任何表中添加一系列递增ID的字符串? 在MySQL中,自动递增的字母数字键,据我所知,是不可能的。您将不得不编写自己的序列生成器,也许是在触发器中。但那似乎是一个疯狂的解决方案! - Mike
主键本身就是唯一键,但我希望以字符串形式跟踪唯一键。假设员工表包含从1开始的员工记录,但我想从EMP-0001开始,以此类推...以使其再次唯一且可读。 - Rubyist
3个回答

9
您不能在一个列中完成此操作,除非您指定一个BEFORE INSERT触发器来预先填充它,完全由您来避免任何自增处理的竞争条件。auto_increment只能用于整数或浮点数列。
在我看来,“要求”PK具有特定格式和“仅自动递增”是相互排斥的。
这并不意味着您不能在选择上“伪造”它:
SELECT CONCAT('ABC1',LPAD(id,5,'0')) FROM tablename;

兄弟,你真是帮我省了不少时间。非常感谢! - Ivan

0

实现这个是一个不好的主意。你将不得不手动找到下一个值,然后你会受到竞争条件的影响。这可能会导致严重的数据完整性问题,如果你没有完全正确地解决这个问题,那么这些问题将无法修复。然而,如果你只想显示客户姓名和编号,这是可能的,但对于一个客户来说,编号将不会按顺序排列。(我以客户为例,实际上我不知道你的前缀代表什么),所以如果ABC001、DEF002、ABC003可以接受,那么就通过连接字符串获取你的自动化真实ID的编号。


-1
另外,除了Wrikken的回答,你还可以从数据库中选择“next”值。
SELECT LPAD( max( substr( id, 5 ) ) +1, 4, '0' ) FROM tablename

然后在您的下一个插入语句中使用此值。


这个解决方案“原样”是不可接受的,需要更多的工作来防止竞态条件。 - Wrikken

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接