在没有AUTO_INCREMENT的CHAR字段中查找下一个ID

时间:2018-05-22 07:05:56

标签: php mysql

我有一个存储对象的表。对象可以是从椅子到员工的任何东西。一个Object有一个ObjectID,它是Object上的10个字符的代码-39条形码标签。

许多对象已经有了一个Label,因此会向它们发送一个ObjectID。有些人有前缀,例如" 9000000345"可能是一个服务台或" 0000000895"可能是一张带发票的文件夹。

例如,当人们开始使用新文件夹时,他们会使用预先打印的条形码标签 并把它们放在上面。预打印的条形码标签由打印机生成,只需将数字增加1并将其填充为10位数,然后将其打印为代码39。

全部大多数对象都存储在Excel表格中。现在应该将它们迁移到MySQL数据库中。

现在,系统还应该能够自己创建对象。系统创建的对象具有领先的" 1"例如" 1000000426"

问题:如何获取自动生成的对象的下一个ObjectID? 我真的不能使用AUTO_INCREMENT,因为表中还有非自动生成的行。

另一件要说的是' ObjectID'字段必须是CHAR(10),因为在特殊情况下使用的字母数字前缀类似于" T1" - > " T100003158"

使用AUTO_INCREMENT时

我的表:

    | ID |   Created   |   ObjectID   | Parent |    Title    |   Changed   | Note |
    |----|-------------|--------------|--------|-------------|-------------|------|
    | 1  | <timestamp> | "1000000001" |  NULL  | "Shelf 203" | <timestamp> | NULL |
    | 2  | <timestamp> | "9000000458" |  NULL  | "Lamp"      | <timestamp> | NULL |
    | 3  | <timestamp> | "1000000003" |  NULL  | "Shelf 204" | <timestamp> | NULL |

表中最后一个Object的ObjectID应为&#34; 1000000002&#34;不是&#34; 1000000003&#34;

我希望我能够很好地解释这个问题。

1 个答案:

答案 0 :(得分:0)

朴素的解决方案可以是:

SELECT CAST(ObjectID AS UNSIGNED) + 1 FROM yourTable WHERE ObjectId LIKE "1%" ORDER BY ObjectID DESC LIMIT 1

基本上搜索以1xxxx开头的所有对象ID然后对它们进行排序(因为它的零填充我们仍然可以排序)然后将结果转换为int并递增它。

首先可以更快地转换为int然后执行。休息是一样的