当前位置:首页 » 编程语言 » sqlnextval
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

sqlnextval

发布时间: 2022-06-30 05:12:56

① 关于oracle 序列值的问题 我有一个序列为41的序列 我使用sql 语句 序列名.nextval 测试生成的下一个id

你的高速缓存大小为20,现在查询的nextval是32,说明缓存中还存在部分ID,开始于41,是只下次新申请ID,是从41开始,一次申请20个放入内存中,使用nextval时则是一个一个取出来,使用的cash,就是为了提高序列的效率。

② PL/SQL导入数据时设置相应的sequence.nextval

一行一条数据的,那就可以直接更新啊。

update table a set a.id = sequence.nextval where a.id is null ;

这句话就直接可以把表中ID为空的字段添加一个子增列并且都是唯一

③ sql中sequence的用法

insert into PRODUCT (你建的序列.NEXTVAL,PRD_DESCRIPTION) values (id,description)
在每次插入数据的时候,id都会按你建的序列的增量自动增加。

sequence就是所谓的序列号,每次取的时候它会自动增加,一般用在需要按序列号排序的地方。

1、 create sequence

你首先要有create sequence或者create any sequence权限,

create sequence emp_sequence

INCREMENT BY 1 -- 每次加几个

START WITH 1 -- 从1开始计数

NOMAXVALUE -- 不设置最大值

NOCYCLE -- 一直累加,不循环

CACHE 10;

一旦定义了emp_sequence,你就可以用CURRVAL,NEXTVAL

CURRVAL=返回sequence的当前值

NEXTVAL=增加sequence的值,然后返回sequence值

比如:

emp_sequence.CURRVAL

emp_sequence.NEXTVAL

可以使用sequence的地方:

- 不包含子查询、snapshot、VIEW的 SELECT 语句

- INSERT语句的子查询中

- NSERT语句的VALUES中

- UPDATE 的 SET中

可以看如下例子:

INSERT INTO emp VALUES

(empseq.nextval, 'LEWIS', 'CLERK',7902, SYSDATE, 1200, NULL, 20);

SELECT empseq.currval FROM DUAL;

但是要注意的是:

- 第一次NEXTVAL返回的是初始值;随后的NEXTVAL会自动增加你定义的INCREMENT BY值,
然后返回增加后的值。CURRVAL 总是返回当前sequence的值,但是在第一次NEXTVAL
初始化之后才能使用CURRVAL,否则会出错。一次NEXTVAL会增加一次sequence的值,
所以如果你在同一个语句里面使用多个NEXTVAL,其值就是不一样的。明白?

- 如果指定CACHE值,oracle就可以预先在内存里面放置一些sequence,这样存取的快
些。

cache里面的取完后,oracle自动再取一组到cache。 使用cache或许会跳号, 比如
数据库突然不正常down掉(shutdown abort),cache中的sequence就会丢失. 所以可
以在create sequence的时候用nocache防止这种情况。

2、 Alter sequence

你或者是该sequence的owner,或者有ALTER ANY sequence权限才能改动sequence。 可
以alter除start值之外的所有sequence参数。如果想要改变start值,必须drop sequence
再re-create。例子:

ALTER sequence emp_sequence

INCREMENT BY 10

MAXVALUE 10000

CYCLE -- 到10000后从头开始

NOCACHE;

影响sequence的初始化参数:

sequence_CACHE_ENTRIES =

设置能同时被cache的sequence数目。

可以很简单的Drop sequence

DROP sequence order_seq;

sequence的用法:

create seqence sequence_name
[start with n1] ----------------->n1到n5都是整数;start with 生成的第一个n1值

[increment by n2] -----------------> increment by n2 递增量,可以为正整数或负整数,指明每一次增加多少

[maxvalue n3|no maxvalue]----------------->maxvalue最大值,no maxvalue用于指定序列没有上限

[minvalue n4|no minvalue]----------------->minvalue 最小值,no minvalue,没有指定最小下限

[cache n5|no cache] ----------------->cache 用高速缓存中可以预分配的序列号个数,默认是20。 如果缓存中的序列号没有用完就关闭数据库等其它原因.

使用 sequence

CURRVAL 和 NEXTVAL 能够在以下情况使用:insert的values字句、select中的select列表、update中的set字句

CURRVAL 和 NEXTVAL 不能够在以下情况使用:子查询、视图和实体化视图的查询、带distinct的select语句、带 group by和order by的select语句、带union或intersect或minus的select语句、select中的where字句、create table与alter table中的default值、check约束条件。

删除sequence

drop sequence seq_a;当删除sequence后,对应它的同义词会被保留,但是引用时会报错。

oracle rac环境中的sequence

oracle为了在rac环境下为了sequence的一致性,使用了三种锁:row cache lock、SQ锁、SV锁。

row cache lock的目的是在sequence指定nocache的情况下调用sequence.nextval过程中保证序列的顺序性;

SQ锁是应用于指定了cache+noorder的情况下调用sequence.nextval过程中。

SV 锁(dfs lock handel) 是调用sequence.nextval期间拥有的锁。前提是创建sequence时指定了cache 和order属性 (cache+order)。order参数的目的是为了在RAC上节点之间生成sequence的顺序得到保障。

创建sequence赋予的cache值较小时,有enq:sq-contention等待增加的趋势。

cache的缺省值是20.因此创建并发访问多的sequence时,cacheh值应取大一些。否则会发生enq:sq-contention等待事件。

rac上创建sequence时,如果指定了cache大小而赋予noorder属性,则各节点将会把不同范围的sequence值cache到内 存上。若两个节点之间都必须通过依次递增方式使用sequence,必须赋予如下的order属性(一般不需要这样做)”sql> create sequence seq_b cache 100 order”。

如果是已赋予了cache+order属性的sequence,oracle使用SV锁进行同步。SV锁争用问题发生时的解决方法与sq锁 的情况相同,就是将cache 值进行适当调整。

在RAC多节点环境下,Sequence的Cache属性对性能的影响很大。应该尽量赋予cache+noorder属性,并要给予足够的 cache值。如果需要保障顺序,必须赋予cache+order属性。但这时为了保障顺序,实例之间需要不断的交换数据。因此性能稍差。

(3)sqlnextval扩展阅读:

seqence的作用:

sequence号是数据库系统按照一定规则自增的数字序列,因为自增所以不会重复。目前就我所了解的sequence的作用主要有两个方面。

一:作为代理主键,唯一识别;

二:用于记录数据库中最新动作的语句,只要语句有动作(insert/delete等),sequence号都会随着更新,所以我们可以根据sequence号来select出更新的语句。

④ 参数化sql的SQL语句中,往oracle库中插入序列.nextval,参数该付什么类型的值

1.nextval与序列关联,表示下一个,如:
创建里一个序列seq_1:#序列一般表示第几行,起标识作用
create sequence seq_1 increment by 1 start with 1
在表中使用此序列:
INSERT INTO A VALUES (seq_1.nextval, 'LEWIS', 'CLERK',7902, SYSDATE, 1200, NULL, 20);
2.values与insert 连用,标示插入的字段值,如:
有一个表 A,A有三个字段:name,age,sex,都是archar2类型的,则往表中插入数据语句为:
insert into A values ('name','age','woman')

⑤ SQL里面如何插入自动增长序列号字段

INSERT时如果要用到从1开始自动增长的数字做唯一关键字,
应该先建立一个序列号.CREATE
SEQUENCE
序列号的名称
(最好是表名+序列号标记)
INCREMENT
BY
1
START
WITH
1
MAXVALUE
99999
NOCYCLE
NOCACHE;其中最大的值按字段的长度来定,比如定义的自动增长的序列NUMBER(6)
,
最大值为999999INSERT
语句插入这个字段值为:
序列号的名称.NEXTVAL例子:
SQL>
insert
into
s_dept(id,
name,
region_id)
values
(s_dept_id.nextval,
‘finance’,
2);1
row
created.只有运行了序列号的名称.
nextval后序列号的名称.
currval
才有效才有值.

⑥ Oracle数据库中nextval和values代表什么意思

可以通过在 SQL 语句中使用 NEXTVAL 或 CURRVAL 运算符来访问序列的值。必须用以 sequence.NEXTVAL 或 sequence.CURRVAL 格式驻留在同一个数据库中的序列名称(或同义词)来限定 NEXTVAL 或 CURRVAL。表达式也可以用所有者名来限定序列,如 zelaine.myseq.CURRVAL。可以指定 sequence 的 SQL 标识或有效同义词(如果存在的话)。

在符合 ANSI 的数据库中,如果您不是所有者,必须用所有者名(owner.sequence)限定序列名。

要对序列使用 NEXTVAL 或 CURRVAL,必须对序列具有选择特权或对数据库具有 DBA 特权。关于序列级特权的信息,请参阅 GRANT 语句。

使用 NEXTVAL
第一次访问一个序列,在引用 sequence.CURRVAL 之前必须先引用 sequence.NEXTVAL。第一次引用 NEXTVAL,返回序列的初始值。后面每次引用 NEXTVAL,用已定义的 step 增加序列值并返回序列新的增加以后的值。

在一个 SQL 语句中只能对给定的序列增加一次。即使在一个语句中多次指定 sequence.NEXTVAL,序列也只增加一次,所以每次 sequence.NEXTVAL 出现在同一 SQL 语句中返回相同的值。

除了在同一语句中多次出现这种情况以外,每个 sequence.NEXTVAL 表达式都会增加序列,无论后来是否提交或回滚当前事务。

如果在最终回滚的事务中指定 sequence.NEXTVAL,某些序列数可能被跳过。

使用 CURRVAL
任何对 CURRVAL 的引用返回指定序列的当前值,该值是最后一次对 NEXTVAL 的引用所返回的值。用 NEXTVAL 生成一个新值以后,可以继续使用 CURRVAL 访问这个值,不管另一个用户是否增加这个序列。

如果 sequence.CURRVAL 和 sequence.NEXTVAL 都出现在一个 SQL 语句中,则序列只增加一次。在这种情况下,每个 sequence.CURRVAL 和 sequence.NEXTVAL 表达式都返回相同的值,不管在语句中 sequence.CURRVAL 和 sequence.NEXTVAL 的顺序。

序列的并发访问
序列总是在数据库中生成唯一值,即使当多个用户并发地引用同一序列时也没有可察觉的等待或锁定。当多个用户使用 NEXTVAL 来增长序列时,每个用户生成一个其他用户不可见的唯一值。

当多个用户并发地增加同一序列时,每个用户看到的值是有差异的。例如,一个用户可能从一个序列生成一组值,如 1、4、6 和 8,而另一个用户并发地从同一序列生成值 2、3、5 和 7。

限制
NEXTVAL 和 CURRVAL 只在 SQL 语句中有效,并不在 SPL 语句中直接有效。(但是使用 NEXTVAL 和 CURRVAL 的 SQL 语句可用于 SPL 例程。)以下限制应用于 SQL 语句中的这些运算符:

必须对序列有选择特权。
在 CREATE TABLE 或 ALTER TABLE 语句中,在下列上下文中不能指定 NEXTVAL 或 CURRVAL:
在 DEFAULT 子句中
在检查约束中。
在 SELECT 语句中,下列上下文中不能指定 NEXTVAL 或 CURRVAL:
使用 DISTINCT 关键字时在投影列表中。
在 WHERE、GROUP BY 或 ORDER BY 子句中
在子查询中
在 UNION 运算符结合 SELECT 语句时。
在下列这些上下文中也不能指定 NEXTVAL 或 CURRVAL:
在分段存储表达式中
在对另一个数据库中的远程序列对象的引用中。
示例
在下面的例子中,假设没有其它用户并发地访问序列并且用户连续执行语句。

⑦ 任何sql语句都可以使用currval或nextval属性吗

这是序列有的特性,在一个会话中先执行了nextval后,在同一个会话中可以用currval取值就可以了

⑧ oracle序列用nextval取值的问题

很简单,每次select seq.nextval 值都会增加1。所以你在plsql中使用 nextval 查询值的时候,它就返回的是加1后的值了。不信可以在 plsql中多用nextval取值,每一次都不一样,都是递增1。如果获取当前值是 currval。nextval每次查询都会增1。这是oralce的特点。

⑨ 数据库中nextval是什么意思

oracle数据库中nextval用来获取序列号的下一个squence的值。

在oracle中sequence就是所谓的序列号,每次取的时候它会自动增加,一般用在需要按序列号排序的地方或者在实际开发中,比如一个需求表格中的需求ID是唯一主键,都可以用sequence来获取。

首先在用Oracle序列号之前,我们首先得创建一个序列然后就可以通过CURRY、NEXTVAL,获取当前表中的返回sequence的当前值、下一个squence的值。


(9)sqlnextval扩展阅读

获取一个sequence值的方法:

SELECT INR_REQUIRMENT_SQUENCE.CURRVAL FROM al –获取当前的sequence的值。

第一次NEXTVAL返回的是初始值;随后的NEXTVAL会自动增加你定义的INCREMENT BY值, 然后返回增加后的值。

CURRVAL 总是返回当前sequence的值,但是在第一次NEXTVAL 初始化之后才能使用CURRVAL,否则会出错。一次NEXTVAL会增加一次sequence的值, 所以如果你在同一个语句里面使用多个NEXTVAL。

⑩ sql 预编译的情况下怎么用nextval

1、首先要有createsequence或者createanysequence权限,createsequenceemp_sequenceINCREMENTBY1--每次加几个STARTWITH1--从1开始计数NOMAXVALUE--不设置最大值NOCYCLE--一直累加,不循环CACHE10;2、插入到表中,INSE