1

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

4

3 回答 3

2

如果您在 Oracle 的表服务器中执行此操作,您将为每种类型的帐户使用不同的SEQUENCE对象。

MySQL的MariaDB 分支具有类似的 SEQUENCE 对象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 的虚拟表来模拟序列对象。这是一个杂物。创建下表(每个序列一个)。

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); 

插入虚拟表后,LAST_INSERT_ID() 返回一个唯一的 id。DELETE 查询只是防止这个虚拟表占用太多空间。

于 2020-06-08T11:37:54.853 回答
1

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

于 2020-06-08T11:24:49.210 回答
0
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),?,?,?,?,?,?)")

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

于 2021-10-22T05:41:28.440 回答