Oracle資料庫中nextval和values代表什麼意思

時間 2021-08-11 18:10:17

1樓:匿名使用者

可以通過在 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:

在分段儲存表示式中

在對另一個資料庫中的遠端序列物件的引用中。

示例在下面的例子中,假設沒有其它使用者併發地訪問序列並且使用者連續執行語句。

2樓:匿名使用者

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,***,都是archar2型別的,則往表中插入資料語句為:

insert into a values ('name','age','woman')

oracle,一個insert語句中呼叫序列的2次nextval,序列增長的問題。

3樓:

insert是插入一條記錄,從無到有

update 是更新已經有的記錄

如果你資料庫有記錄 1,2,3

前提主鍵沒有唯一約束,如果你更新where 主鍵=3的,則不會出現第2條,如果你insert 3,那麼自然會重複。

nextval是oracle自帶的序列,這個和你什麼時候插入記錄毫無關係,只要呼叫了一次nextval,則oracle內部就會把對應這個名字的序列自增1,不管你有沒有插入記錄到表裡,比如nextval是3,這時候沒插入表,又取了一次,那麼下次就是4了。nextval會直接返回一個自增的不重複的編號

你說的重複,要麼是表裡已經有了2,3,4記錄,但序列從1開始,那麼自然也會1,2,3,4這樣取,因為序列和你的業務表毫無關係;要麼是你**有問題,比如你insert into table values (art_id.nextval,art_id.nextval);丟到了迴圈裡,執行了n次,如果表沒主鍵約束,自然就重複記錄了。

你可以排查下主鍵相同的2個記錄,其他欄位是否也相同,建議把**裡所有的insert語句都列印出來,這樣在控制檯裡一目瞭然,哪些是該執行的,哪些是多餘的,好定位問題。

4樓:

按我的理解。應該是你放在一條sql語句當中時候。只增長1次。

比如你寫2個insert語句。結果應該不同。

5樓:雲湖醉客

nextval 用到就增加的,不會像你說的不增加,我沒有遇到過

oracle中如何資料庫,oracle中如何新建一個資料庫

oracle裡面不叫資料庫了,叫建立一個名稱空間建立表空間的語法是 create tablespace tablespacenamedatafile filename size integer k m autoextend off on 建立使用者 create user scce identifi...

sql資料庫和oracle資料庫哪個好

兄弟,聽我的。肯定學習oracle。原因 1 oracle是商用的最廣泛的關係型資料庫管理系統,廣泛應用於銀行 電信 電力 社保等各個領域。特別是對於unix和linux平臺,sqlserver怎麼用啊?我想你學習,肯定為了將來應用,或者工作,你的簡歷裡面寫oracle和sqlserver完全是不一...

關於oracle資料庫使用者和資料庫之間的關係

表空間,其實是 預設表空間。也就是這個使用者 create table 語句,不指定表空間的話。就預設把表,建立在那個 預設表空間 上面。沒有給他指定其它表空間的管理許可權 但使用者a能操作其它表空間,在其它表空間中建立表,是怎麼回事哪。這個要看你到底給了多少許可權給這個使用者a 你要是sql gr...