模拟MySQL / InnoDB中的自动增量

时间:2010-07-20 16:29:54

标签: mysql innodb

假设我将模拟MySQL / InnoDB中的自动增量

条件

  1. 使用MySQL / InnoDB
  2. ID字段没有唯一索引,也不是PK
  3. 是否可以仅使用程序逻辑进行模拟,而无需使用表级锁定。 感谢。

4 个答案:

答案 0 :(得分:3)

答案 1 :(得分:2)

创建另一个表,其中包含一个存储下一个id值的行和列。然后在原始表上创建一个插入触发器,使第二个表中的值递增,抓取它,并将其用于第一个表上的ID列。您需要注意选择和更新的方式,以确保它们是原子的。

基本上,您在MySQL中模拟Oracle sequence。但它会导致序列表中单行的锁定,因此可能使它不适合你正在做的事情。

ETA:

另一个类似但可能性能更好的选项是创建第二个“序列”表,它只有一个自动增量PK列而没有其他数据。让您的插入触发器在该表中插入一行,并使用从那里生成的ID来填充原始表中的ID。然后要么让触发器或其他进程定期删除序列表中的所有行来清理它。

答案 2 :(得分:2)

CREATE TABLE sequence (id INTEGER); -- possibbly add a name;
INSERT INTO sequence VALUES (1); -- starting value

SET AUTOCOMMIT=0;
START TRANSACTION;
UPDATE sequence SET id = LAST_INSERT_ID(id+1);
INSERT INTO actualtable (non_autoincrementing_key) VALUES (LAST_INSERT_ID());
COMMIT;

SELECT LAST_INSERT_ID();甚至是会话安全值,用于检查您获得的ID。确保您的表支持事务,或序列中的漏洞没有问题。

答案 3 :(得分:0)