如何在不自动递增的情况下递增 id?

How to increment id without auto increment?

我有一个 table,id 列是一个有意义的数字。不同类型的账户从不同的范围开始。例如组织 10000 <-> 100000,用户 1000000 <-> 1kk。如何在插入时正确增加 id(可能存在并发问题)?

我建议您使用普通的基于序列的 bigint 列。然后,在 SELECT 上,将相应帐户类型的基础添加到列中。

如果您在 Oracle 的 table 服务器中执行此操作,您将为每种类型的帐户使用 different SEQUENCE objects

MariaDB fork of MySQL has a similar kind of SEQUENCE object, as does PostgreSQL。所以如果你使用的是 MariaDB,你会做这样的事情。

CREATE SEQUENCE IF NOT EXISTS org_account_id MINVALUE=10000 MAXVALUE=999999;
CREATE SEQUENCE IF NOT EXISTS user_account_id MINVALUE=1000000;

然后要使用序列代替自动增量,您将执行类似的操作。

INSERT INTO tbl (id, col1, col2) 
         VALUES (NEXTVAL(user_account_id), something, something);

在 MySQL 中,您可以使用包含自动增量 ID 的虚拟 table 模拟序列对象。这是一个kludge。创建以下 table(每个序列一个)。

CREATE TABLE user_account_id (
     sequence_id BIGINT NOT NULL AUTO_INCREMENT,
     PRIMARY KEY (`sequence_id`)
);
ALTER TABLE user_account_id AUTO_INCREMENT=1000000;

然后依次发出这些查询以插入具有唯一用户 ID 的行。

INSERT INTO user_account_id () VALUES (); 
DELETE FROM sequence WHERE sequence_id < LAST_INSERT_ID();
SET @id:=LAST_INSERT_ID();
INSERT INTO tbl (id, col1, col2) 
         VALUES (@id, something, something); 

在您插入虚拟 table 之后,LAST_INSERT_ID() returns 一个唯一的 ID。 DELETE 查询只是防止这个虚拟 table 占用太多 space.

PreparedStatement ps = con.prepareStatement("insert into emp(emp_code,emp_name,join_date,designation,birth_date,gender,mobile) values((select max(emp_code)+1 from emp),?,?,?,?,?,?)")

这个查询肯定会有帮助..