如何在不自动递增的情况下递增 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),?,?,?,?,?,?)")
这个查询肯定会有帮助..
我有一个 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),?,?,?,?,?,?)")
这个查询肯定会有帮助..