【问题标题】:How do I generate a unique sequential number in java?如何在java中生成唯一的序列号?
【发布时间】:2016-06-16 09:25:11
【问题描述】:

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

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 中也是唯一的序列生成?

【问题讨论】:

  • 为什么不尝试使用 UUID?
  • 可以选择数据库序列吗?根据创建时间缓存是否有效,它可能包含漏洞甚至最终是非单调的,但即使使用分布式服务器,它也能确保唯一性。
  • @RenukaDeshmukh UUID 是随机生成的长字符串。我希望数字是连续的(如 001,002 等)。
  • 并使用带有 BEFORE 顺序的 selectKey 将“EMP”添加到 keyproperty 中的 LAST_INSERT_ID 存储区并将其用作查询中的值?
  • 你已经用“java”标记了这个问题——java在这里有什么相关性?

标签: mysql mybatis sequences


【解决方案1】:

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

  1. 创建没有自动增量的表。示例:
CREATE TABLE EMPLOYEE (
    ID CHAR(30), NAME CHAR(30)
)
  1. 使用自动增加列的逻辑创建触发器。类似于:
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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多