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