當前位置:首頁 » 編程語言 » 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