基于带字母的整数创建ID

时间:2013-07-16 10:59:13

标签: php mysql identifier

我有一个包含整数自动增量"id"列的消息的数据库。古典。但我想基于这个整数id创建一个“视觉”id。这就是我想要的:

A0001
A0002
[...]
A9999
B0001
B0002
[etc]

理想情况是基于整数id自动生成(在MYSQL中)此messageId。我也可以在PHP中生成这个id。但是怎么样?困难在于我们必须检查数据库中的最后一个id来计算视觉ID的字母前缀。

你能帮我生成这个吗?在MYSQL中是否可以直接或在PHP中使用?

4 个答案:

答案 0 :(得分:1)

您可以使用以下内容,但它仅适用于0到249999之间的数字(A0000 - Z9999)

select concat(char(ord('A')+round(ID / 10000)),ID % 10000) from ...

要从视觉ID转换回来,您可以使用以下内容:

select ord(VISUAL_ID)-ord('A')+mid(VISUAL_ID,2)

答案 1 :(得分:0)

你考虑过使用hex吗?为什么不写OxA001如果你A001那么它仍然是整数,那么它是字符串并且不可能有自动增量。

但如果你真的想在mysql中做到这一点,唯一的方法是使用 TRIGGERS。

您有2个选项可以创建插入 AFTER BEFORE 插入语句,在此触发器中,您应该根据前一行将ID的值更新为您的值。但我真的建议使用 hex

您可以阅读有关触发器here

的更多信息

答案 2 :(得分:0)

您可以使用before insert触发器创建此类ID以创建新值。

基本上你会查找最大值,然后通过执行以下操作来增加它:

(case when maxvalue like '%9999'
      then concat(char(ascii(left(maxvalue, 1) + 1)), '0000')
      else concat(left(maxvalue, 1), lpad(right(maxvalue, 4) + 1), 4, '0')
 end);

但是,我不鼓励你这样做,只是设置一个常规的自动增量列。

答案 3 :(得分:0)

试试这可能对你有所帮助。

for ($i = 'A'; $i != 'AA'; $i++) 
{
$prefix = $i;
$id = $prefix.sprintf("%03s",$suffix);
for ($j=1;$j<=5;$j++) 
{

$res = "$id"."$j";
echo "$res"."<br>";

}
}