如何在java中生成唯一的序列号?

时间:2016-03-03 07:21:49

标签: mysql mybatis sequences

我需要创建一个实体表单,它在数据库中有唯一的标识列,而不是主键列,我需要在表单创建页面中显示它。我已将此列设置为UNIQUE而非null。现在每当我创建一个新用户,员工或任何实体时,我需要生成一个序列号,如此格式,并在表单中显示,

ID_001, ID_002 ... ID_00N and so on.

EMP_001, EMP_002 ... EMP_00N and so on.

当三位数序列号达到最大限制999时。序列号应该生成四位数字,直到达到9999,员工代码将像EMP_1000。因此,当我在创建表单时获取最后一个插入ID时,如果多个用户同时创建并且存在冲突,则它将无法工作。我想过创建一个像sequence_generator这样的新表。我存储实体 - 最后一个插入ID的键值对。因此,当下一次插入发生时,我可以从该表中读取并为新序列号递增1。

那么我如何才能最好地实现这个序列生成,这在Java/MySql/Mybatis/Spring

中也是唯一的

1 个答案:

答案 0 :(得分:1)

我会使用触发器创建自己的测序实现。我对mysql不太熟悉。所以,把我的例子作为伪代码。你的触发器看起来像:

  1. 创建一个没有自动增量的表。例如:
  2. CREATE TABLE EMPLOYEE (
        ID CHAR(30), NAME CHAR(30)
    )
    
    1. 使用逻辑自动增加列来创建触发器。类似于:
    2. CREATE TRIGGER EMPLOYEE_SEQUENCE BEFORE INSERT ON EMPLOYEE
      FOR EACH ROW
      BEGIN
          SET @PREPENDED_ZEROS = '';
          SET @ID_AS_NUMBER = CAST(SUBSTRING(ID,3) AS INT) + 1;
          IF @ID_AS_NUMBER < 10 THEN
             SET @PREPENDED_ZEROS = '00';
          ELSEIF @ID_AS_NUMBER < 100 THEN
             SET @PREPENDED_ZEROS = '0';
          END IF;
          SET NEW.ID = 'EMP_' || @PREPENDED_ZEROS || @ID_AS_NUMBER;
      END;