GVKun编程网logo

Oracle Sequence nextval正在来回跳转数字(oracle 跳出当前循环)

12

本文将分享OracleSequencenextval正在来回跳转数字的详细内容,并且还将对oracle跳出当前循环进行详尽解释,此外,我们还将为大家带来关于dualisnotmapped,select

本文将分享Oracle Sequence nextval正在来回跳转数字的详细内容,并且还将对oracle 跳出当前循环进行详尽解释,此外,我们还将为大家带来关于dual is not mapped,select ordercode_seq_id.nextval nextvalue from dual、java – setText(CharSequence,TextView.BufferType)和setText(CharSequence)的不同、MySQL相当于Oracle的SEQUENCE.NEXTVAL、MySQL等同于Oracle的SEQUENCE.NEXTVAL的相关知识,希望对你有所帮助。

本文目录一览:

Oracle Sequence nextval正在来回跳转数字(oracle 跳出当前循环)

Oracle Sequence nextval正在来回跳转数字(oracle 跳出当前循环)

我创建了一个新表和一个新序列,我有两个C#Web服务试图使用相同的查询将记录插入到该表中mySequence.nextval(是的,我检查了很多次,它们都使用mySequence.nextval)。

这两个Web服务正在向表中插入行,但是mySequence.nextval返回的是乱序的数字

这是创建记录的方式,显示了PrimaryKey从中获取值的记录mySequence.nextval

1 21 22 23 2 3 24 25 4 27 28 5

到目前为止,没有重复项,但是为什么要mySequence.nextval来回跳动呢?我应该担心吗

更新: 使用cache_size = 20创建序列

答案1

小编典典

我敢打赌,您的数据库正在运行RAC(Real Application
Clusters)。假设是这种情况,并且您使用所有默认设置创建了序列,这就是预期的行为。

默认设置是缓存20个值。默认情况下,RAC群集中的每个节点都将具有单独的缓存。假设您有一个包含两个节点A和B的群集,则第一次nextval在A上请求a时,A将缓存值1-20并返回值1。如果nextval在B上对a的下一个请求,则B将缓存值21-40并返回值21。从那里开始,获得的值将取决于您的连接恰好在其上运行的节点。

通常,这应该不成问题。序列生成唯一的数字。这些数字通常不必是连续的。如果您确实需要按顺序返回值,因为您正在执行一些操作,例如按序列生成的值排序以确定“第一”或“最后”行,则可以ORDER在创建序列时使用该子句来强制返回值为了。但是,这对RAC数据库具有负面的性能影响,因为它增加了节点之间进行同步以返回值同步所需的通信量。如果您需要确定“第一行”或“最后一行”,date``timestamp

dual is not mapped,select ordercode_seq_id.nextval nextvalue from dual

dual is not mapped,select ordercode_seq_id.nextval nextvalue from dual

   项目中,用到一个序列作单号,框架用的是ssh,在dao层去拿的时候,运行时报错为dual is not mapped,[select ordercode_seq_id.nextval nextvalue from dual]

           后来检查发现,获取方式不对,于是改成下面这样,就可以正常获取了

Java代码 
  1. public String getOrderCode() {  
  2.     try {  
  3.         String sql = "select ordercode_seq_id.nextval nextvalue from dual";  
  4.         Integer maxId = (Integer)(this.getSession().createSQLQuery(sql).addScalar("nextvalue", Hibernate.INTEGER) ).uniqueResult();  
  5.         return maxId.toString();  
  6.     } catch (Exception e) {  
  7.         e.printStackTrace();  
  8.     }  
  9.     return null;  
  10. }  

java – setText(CharSequence,TextView.BufferType)和setText(CharSequence)的不同

java – setText(CharSequence,TextView.BufferType)和setText(CharSequence)的不同

setText(CharSequence,TextView.BufferType)和setText(CharSequence)有什么区别,什么时候应该使用它们?

解决方法:

setText (CharSequence text)

设置TextView的字符串值.而

setText (CharSequence text, TextView.BufferType type) 

设置此TextView要显示的文本,并设置它是否存储在可设置样式/可跨接的缓冲区中以及是否可编辑.

所有BufferType选项都是:

> TextView.BufferType.EDITABLE
> TextView.BufferType.norMAL
> TextView.BufferType.SPANNABLE

例如

myEditText.setText("This is new text from setText with BufferType EDITABLE.",  TextView.BufferType.EDITABLE); 

MySQL相当于Oracle的SEQUENCE.NEXTVAL

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,因此如果可以在一个查询中完成就更好。

答案1

小编典典

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

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

答案2

小编典典

3.6.9。使用AUTO_INCREMENT

AUTO_INCREMENT属性可用于为新行生成唯一标识:

CREATE TABLE animals (     id MEDIUMINT NOT NULL AUTO_INCREMENT,     name CHAR(30) NOT NULL,     PRIMARY KEY (id));INSERT INTO animals (name) VALUES    (''dog''),(''cat''),(''penguin''),    (''lax''),(''whale''),(''ostrich'');SELECT * FROM animals;Which returns:+----+---------+| id | name    |+----+---------+|  1 | dog     ||  2 | cat     ||  3 | penguin ||  4 | lax     ||  5 | whale   ||  6 | ostrich |+----+---------+

没有为AUTO_INCREMENT列指定任何值,因此MySQL自动分配了序列号。你还可以为该列显式分配NULL或0以生成序列号。

你可以使用LAST_INSERT_ID()SQL函数或mysql_insert_id()C API函数检索最新的AUTO_INCREMENT值。这些函数是特定于连接的,因此它们的返回值不受也执行插入操作的另一个连接的影响。

对AUTO_INCREMENT列使用最小的整数数据类型,该数据类型应足够大以容纳所需的最大序列值。当列达到数据类型的上限时,下一次生成序列号的尝试将失败。如果可能,请使用UNSIGNED属性,以允许更大的范围。例如,如果使用TINYINT,则最大允许序列号为127。对于TINYINT UNSIGNED,最大数量为255。请参见第11.2.1节“整数类型(精确值)-INTEGER,INT,SMALLINT,TINYINT,MEDIUMINT,BIGINT ”表示所有整数类型的范围。

注意对于多行插入,LAST_INSERT_ID()和mysql_insert_id()实际上从插入的第一行返回AUTO_INCREMENT键。这样可以在复制设置中的其他服务器上正确地复制多行插入。

如果AUTO_INCREMENT列是多个索引的一部分,则MySQL使用从AUTO_INCREMENT列开始的索引(如果有的话)生成序列值。例如,如果动物表包含索引PRIMARY KEY(grp,id)和INDEX(id),则MySQL将忽略PRIMARY KEY来生成序列值。结果,该表将包含单个序列,而不是每个grp值的序列。

要以非1的AUTO_INCREMENT值开头,请使用CREATE TABLE或ALTER TABLE设置该值,如下所示:

mysql> ALTER TABLE tbl AUTO_INCREMENT = 100; InnoDB注意事项

对于InnoDB表,如果要修改在INSERT语句序列中间包含自动增量值的列,请小心。例如,如果使用UPDATE语句在自动增量列中放置一个较大的新值,则后续的INSERT可能会遇到“重复项”错误。如果执行DELETE后再执行更多INSERT语句,或者当你提交事务时(而不是在UPDATE语句之后),则测试是否已经存在自动增量值。

MyISAM笔记

对于MyISAM表,可以在多列索引的第二列上指定AUTO_INCREMENT。在这种情况下,将为AUTO_INCREMENT列生成的值计算为MAX(auto_increment_column)+ 1 WHERE prefix = given-prefix。当你要将数据放入有序组中时,这很有用。

CREATE TABLE animals (    grp ENUM(''fish'',''mammal'',''bird'') NOT NULL,    id MEDIUMINT NOT NULL AUTO_INCREMENT,    name CHAR(30) NOT NULL,    PRIMARY KEY (grp,id)) ENGINE=MyISAM;INSERT INTO animals (grp,name) VALUES    (''mammal'',''dog''),(''mammal'',''cat''),    (''bird'',''penguin''),(''fish'',''lax''),(''mammal'',''whale''),    (''bird'',''ostrich'');SELECT * FROM animals ORDER BY grp,id;Which returns:+--------+----+---------+| grp    | id | name    |+--------+----+---------+| fish   |  1 | lax     || mammal |  1 | dog     || mammal |  2 | cat     || mammal |  3 | whale   || bird   |  1 | penguin || bird   |  2 | ostrich |+--------+----+---------+

在这种情况下(当AUTO_INCREMENT列是多列索引的一部分时),如果删除任何组中具有最大AUTO_INCREMENT值的行,则将重用AUTO_INCREMENT值。即使对于MyISAM表,通常不会重复使用AUTO_INCREMENT值,也会发生这种情况。

进一步阅读

有关AUTO_INCREMENT的更多信息,请参见:

如何将AUTO_INCREMENT属性分配给列:第13.1.17节“ CREATE TABLE语法”和第13.1.7节“ ALTER TABLE语法”。

AUTO_INCREMENT的行为取决于NO_AUTO_VALUE_ON_ZERO SQL模式:第5.1.7节“服务器SQL模式”。

如何使用LAST_INSERT_ID()函数查找包含最新AUTO_INCREMENT值的行:第12.14节“信息函数”。

设置要使用的AUTO_INCREMENT值:第5.1.4节“服务器系统变量”。

AUTO_INCREMENT和复制:第16.4.1.1节“复制和AUTO_INCREMENT”。

可以用于复制的与AUTO_INCREMENT相关的服务器系统变量(auto_increment_increment和auto_increment_offset):第5.1.4节“服务器系统变量”。

MySQL等同于Oracle的SEQUENCE.NEXTVAL

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,因此如果可以在一个查询中完成就更好。

答案1

小编典典

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

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

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

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

我们今天的关于Oracle Sequence nextval正在来回跳转数字oracle 跳出当前循环的分享已经告一段落,感谢您的关注,如果您想了解更多关于dual is not mapped,select ordercode_seq_id.nextval nextvalue from dual、java – setText(CharSequence,TextView.BufferType)和setText(CharSequence)的不同、MySQL相当于Oracle的SEQUENCE.NEXTVAL、MySQL等同于Oracle的SEQUENCE.NEXTVAL的相关信息,请在本站查询。

本文标签: