如何生成下一个请求ID

3
我有一个需求,其中request_id的格式为REQ0000001、REQ0000002……REQ0000010、REQ0000011……REQ0000099 REQ0000100.....,前三个字符是REQ,后面7个字符是数字序列,这个request_id是mysql表中的主键。
假设表中的最后一条记录是REQ0000009,则下一条记录将是REQ0000010。如何在perl中实现?
我使用以下方式:
$sql_query = "select request_id from requests order by request_id DESC LIMIT 1";

将这个值存储在名为x的变量中。然后

$x = reverse $x;  #Reverse the String
chop $x; # Chop the last Character (here R)

chop $x; # Chop the last Character (here E)

chop $x; # Chop the last Character (here Q)

$x = reverse $x; # Again Reverse
$x = $x  + 1; # Add 1

if ( length($x) eq 1) # if length ==1{

    $NextReq_id = 'REQ000000'.$x;

elsif ( length($x) eq 2)


    $NextReq_id = 'REQ00000'.$x;

elsif ( length($x) eq 3)


    $NextReq_id = 'REQ0000'.$x;

elsif ( length($x) eq 4)
{

$NextReq_id = 'REQ000'.$x;
} 

有没有更好的方法来完成这个任务?

你会如何处理 REQ9999999RER0000000 或者 REQ10000000 - TLP
3个回答

3
你可以在Perl中递增字符串:
if ($x lt 'REQ9999999') {
    $nextRequestId = $x;
    $nextRequestId++;
} else {
    // you ran out of request ids
}

如果您没有检查REQ9999999,最终可能会出现RER0000000的情况。


这是实现我想要的好方法。不过,想知道这种方法是否会有任何后果? - Devesh Agrawal
我已经描述了主要的后果,即您必须注意您的增量不会滚动到字符串的字母部分。除此之外,可能会有轻微的性能损失,尽管我相信与执行查询以获取当前最大请求ID的性能成本相比,这将是可以忽略不计的。 - lanzz

2
$sql_query = "SELECT CONCAT('REQ',LPAD(CAST(SUBSTR(request_id,4,7) AS UNSIGNED)+1,7,'0')) ORDER BY request_id DESC LIMIT 1"

1
使用sprintf函数在字符串左侧填充0。
sprintf("REQ%08d", $x)

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