MySQL等同于Oracle的SEQUENCE.NEXTVAL

我需要能够生成运行查询,该查询将返回下表中的ID的下一个值:

CREATE TABLE animals (

id MEDIUMINT NOT NULL AUTO_INCREMENT,

name CHAR(30) NOT NULL,

PRIMARY KEY (id)

)

在Oracle中,您可以在序列上调用NEXTVAL,它为您提供下一个序列(注意:不必在表上进行插入)。

谷歌搜索后,我发现您可以使用以下查询找到auto_increment的当前值:

SELECT Auto_increment 

FROM information_schema.tables

WHERE table_name='animals';

问题是我希望每次查询该值时该值都增加。在Oracle中,当您调用nextval时,即使不将行插入表中,序列的值也会增加。

有什么方法可以修改上面的查询,以使返回的值始终与上次调用该查询的时间不同?即Auto_increment每次检查时都会增加,并且在查询中使用时将使用新值。

我正在使用Spring JDBCTemplate,因此如果可以在一个查询中完成就更好。

回答:

InnoDB的此示例演示了一种使用互锁查询来实现自己的计数器的方法:

http://dev.mysql.com/doc/refman/5.0/en/innodb-locking-

reads.html

您需要为什么创建缺口?要保留ID?我宁愿不惜一切代价“修复”设计并更新其他模块,而不是摸一个序列。

我暗示着通过为每个ID插入一个默认行(标记为无效)来分配和返回ID,而不是仅仅显式地增加序列。这种方法是一致且可移植的。以后,您可以通过匹配的默认值来更新这些默认行,而不必使用显式的序列值来强制插入。这需要更多的内存,但没有锁。在过期的行上进行垃圾收集可以在这里提供帮助。“插入或更新”语句可以重新创建垃圾收集的行,但是我不会这样做。

以上是 MySQL等同于Oracle的SEQUENCE.NEXTVAL 的全部内容, 来源链接: utcz.com/qa/403136.html

回到顶部