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