2016-03-03 2064 views
0

我需要创建一个在数据库中具有唯一标识列的实体表单,它不是主键列,我需要在表单创建页面中显示该表单。我已将此列设置为UNIQUE而不是null。现在,每当我创建一个新的用户,雇员或任何实体我需要生成一个序列号就像这个格式的形式显示出来,如何在java中生成唯一的序列号?

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

+0

你为什么不尝试使用UUID? –

+0

数据库序列是一个选项吗?根据创建时间的不同,它可能包含漏洞,甚至最终不是单调的,即使使用分布式服务器,它也确保了unicity。 –

+0

@RenukaDeshmukh UUID是随机生成的长字符串。我希望数字是连续的(如001,002等)。 – Lucky

回答

1

我会使用触发器创建我自己的测序实现。我对mysql不是很熟悉。所以,以我的例子作为伪代码。您的触发器如下所示:

  1. 创建一个没有自动增量的表格。例如:
CREATE TABLE EMPLOYEE (
    ID CHAR(30), NAME CHAR(30) 
) 
  • 创建具有逻辑来自动递增您的列的触发器。类似:
  • 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;