提问者:小点点

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


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


共2个答案

匿名用户

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

MySQL的MariaDB分叉具有类似的序列对象,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); 

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

匿名用户

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