gpt4 book ai didi

mysql - MySQL等同于Oracle的SEQUENCE.NEXTVAL

转载 作者:IT老高 更新时间:2023-10-28 13:54:35 24 4
gpt4 key购买 nike

我需要能够生成运行查询,该查询将返回下表中的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 - MySQL等同于Oracle的SEQUENCE.NEXTVAL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9046971/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com