nextvalsql
❶ 資料庫中nextval是什麼意思
oracle資料庫中nextval用來獲取序列號的下一個squence的值。
在oracle中sequence就是所謂的序列號,每次取的時候它會自動增加,一般用在需要按序列號排序的地方或者在實際開發中,比如一個需求表格中的需求ID是唯一主鍵,都可以用sequence來獲取。
首先在用Oracle序列號之前,我們首先得創建一個序列然後就可以通過CURRY、NEXTVAL,獲取當前表中的返回sequence的當前值、下一個squence的值。
(1)nextvalsql擴展閱讀
獲取一個sequence值的方法:
SELECT INR_REQUIRMENT_SQUENCE.CURRVAL FROM al –獲取當前的sequence的值。
第一次NEXTVAL返回的是初始值;隨後的NEXTVAL會自動增加你定義的INCREMENT BY值, 然後返回增加後的值。
CURRVAL 總是返回當前sequence的值,但是在第一次NEXTVAL 初始化之後才能使用CURRVAL,否則會出錯。一次NEXTVAL會增加一次sequence的值, 所以如果你在同一個語句裡面使用多個NEXTVAL。
❷ oracle表中有一列是自增長的,用prepareStatement往裡查數據,可否把abale1_seq.nextval寫在sql里
oracle沒有自增長得 用法
如果 是的話, 那麼 可能是用 觸發器實現的。
如果不是用 觸發器的話,可以這么寫
❸ 任何sql語句都可以使用currval或nextval屬性嗎
這是序列有的特性,在一個會話中先執行了nextval後,在同一個會話中可以用currval取值就可以了
❹ oracle序列用nextval取值的問題
不知你注意了沒有,每一個sequence.nextval的值是不一樣的,而且同一sequence每次取值是不一樣的。
當sequence的cache為0時,每次sequence.nextval得到的值是當前sequence的值加1。
但cache不為0時,比如為20,他就意味著每次在緩存中去20次再寫入資料庫去,這樣的的用sequence.nextval得到的值就比較難確定,但能保證每次去的值不一樣,是遞增的。
❺ sql中sequence的用法
sequence是序列號的意思,每次取的時候它會自動增加。sequence與表沒有從屬關系,與表一樣屬於用戶。
在oracle中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的值。但是如果你在同一個條SQL語句裡面針對同一個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 的例子:
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參數:
擁有ALTER ANY SEQUENCE 許可權才能改動sequence. 可以alter除start至以外的所有sequence參數.如果想要改變start值,必須 drop sequence再create。例:
alter sequence SEQ maxvalue 9999999;
alter sequence SEQ cache 10;
在Sql語句中可以使用sequence的地方:
(1)不包含子查詢、snapshot、VIEW的 SELECT 語句
(2)INSERT語句的子查詢中
(3)INSERT語句的values中
(4)UPDATE 的 SET中
例如:
insert into student(id,name) values(seq.Nextval,'jack');
注意:
第一次NEXTVAL返回的是初始值,隨後的NEXTVAL會返回增加後的值。CURRVAL 總是返回當前SEQUENCE的值,但是在第一次NEXTVAL初始化之後才能使用CURRVAL,否則報如下錯誤:
ORA-08002 序列currval尚未在會話中定義。
使用一次NEXTVAL會增加一次 SEQUENCE的值,所以如果你多次執行包含NEXTVAL的一條語句,其值就是不一樣的。
刪除sequence:drop sequence seq_a;
當刪除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的順序得到保障。
(5)nextvalsql擴展閱讀:
定義Sequence:定義一個seq_test,最小值為10000,最大值為99999999999999999,從20000開始,增量的步長為1,緩存為20的循環排序Sequence。
定義方法:
create sequence seq_test
minvalue 10000
maxvalue 99999999999999999
start with 20000
increment by 1
cache 20
cycle
order;
DB2的寫法:
create sequence seq_test
as bigint
start with 20000
increment by 1
minvalue 10000
maxvalue 99999999999999999
cycle
cache 20
order;
PostgreSQL的寫法:
create sequence seq_test
increment by 1
minvalue 10000
maxvalue 99999999999999999
start 20000
cache 20
cycle;
二、Oracle、DB2、PostgreSQL資料庫Sequence值的引用參數為:currval、nextval,分別表示當前值和下一個值。下面分別從三個資料庫的Sequence中獲取nextval的值。
Oracle中:seq_test.nextval
例如:select seq_test.nextval from al;
DB2中:nextval for SEQ_TOPICMS
例如:values nextval for seq_test;
PostgreSQL中:nextval(seq_test)
例如:select nextval('seq_test');
三、Sequence與indentity的區別與聯系
Sequence與indentity的基本作用都差不多。都可以生成自增數字序列。
Sequence是資料庫系統中的一個對象,可以在整個資料庫中使用,和表沒有任何關系;indentity僅僅是指定在表中某一列上,作用范圍就是這個表。
四、postgresql中的Sequence分配策略(postgresql8.3.x)
調用select nextval(seq_test);後,系統馬上分配一個序號給用戶,然後系統的次Sequence馬上加上之前設置的步長(increment by 1),不論此序號用戶是否使用。
調用select currval(seq_test);返回當前的序列號,該序列號只要沒有使用,就不會變化,直到被使用後,才會變化,並且該序列號已經分配給當前請求,不會再分配給其他的請求。
所以,減少浪費時,使用currval,不在乎浪費,而且id不連續的話,可以使用nextval。因為一旦分配給你後,使用失敗,將會把該序列號丟棄!
❻ sql 預編譯的情況下怎麼用nextval
1、首先要有createsequence或者createanysequence許可權,createsequenceemp_sequenceINCREMENTBY1--每次加幾個STARTWITH1--從1開始計數NOMAXVALUE--不設置最大值NOCYCLE--一直累加,不循環CACHE10;2、插入到表中,INSE
❼ 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的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')