oracle序列號、
阿新 • • 發佈:2019-01-14
建立即將使用的表
create table supplier
(s_codde number(6),
sname varchar2(25),
contact varchar2(15),
phone varchar2(15),
fax varchar2(15));
序列號的特點
- 可以由多個使用者共享的資料庫物件.
- 序列號生產機器,專為表中的資料自動產生序列號.
- 由oracle內部例程產生和維護.
- 獨立於使用它的表.
- 通常是用來產生主鍵
- 可以取代生產序列號的應用程式.
- 如果讓它常駐記憶體,可以提高訪問序列號的效率.
建立序列號的語法
CREATE SEQUENCE 序列號名字 [START WITH n] [INCREMENT BY n] [{MAXVALUE n | NOMAXVALUE}] [{MINVALUE n | NOMINVALUE}] [{CACHE n | NOCACHE}] [{CYCLE n | NOCYCLE | CYCLE 20}];
其中:
- 序列號的名字::序列號產生器的名字, 也即是該序列的名字
- START WITH n:定義了所產生的第一個序列號碼,這裡 n 為整數。如果該字句省略,那麼序列就從1開始
- INCREMENT BY n : 定義了序列號增加的步長(序列號之間的間隔,當前序列號與下一個序列號之間的差),如果該字句省略,序列號增加步長為1.
- MAXVALUE n :定義了該序列號可產生的序列號的最大值
- NOMAXVALUE : 說明升序的序列號的最大值為 10的27次方。而降序的序列號的最大值為 -1 (這也是預設值)。
- MINVALUE :定義了可產生序列號的最小值。
- NOMINVALUE : 說明升序序列號的最小值為1,而降序的序列號的最小值為負10的26次方(這也是預設值)。
- CACHE n :說明將有n個序列號碼被oracle 伺服器預分配和儲存在記憶體中。
- NOCACHE:說明沒有序列號被oracle伺服器預分配和儲存在記憶體當中。
- CACHE20:這是預設值。不需要說明。
- CYCLE n:說明在序列號達到最大或最小值後,將繼續產生序列號。
- NOCYCLE:說明在序列號達到最大或最小值之後,將不再產生序列號(這也是預設值)。
使用
建立序列號
create sequence supplier_s_code
start with 2000
INCREMENT by 10
maxvalue 100000
nocache
nocycle;
該語句意思為:從2000開始,步長為 10 最大值為 100000, 沒有預分配,最大值之後不在產生序列號
檢視序列號資訊
SELECT * FROM user_sequences;
如果想檢視當前序列號的值,與序列號下一次的值,可以利用SELECT 語句 加2個位列來查詢。NEXTVAL 以及 CURRVAL
- NEXTVAL:返回序列號下一次可獲得的值
- CURRVAL:返回序列號當前的值
使用序列號插入資料
INSERT INTO supplier
(s_codde, sname, contact, phone, fax)
VALUES
(supplier_s_code.nextval, '仙客來百貨','張根發', 4444944, 4444844);
提示插入成功,那麼現在可以使用 CURRVAL 來獲取序列當前的值了。
SELECT supplier_s_code.currval FROM dual
建立新的序列。
CREATE SEQUENCE ord_ordno START WITH 1 INCREMENT BY 1 MAXVALUE 10000 NOCYCLE
通過查詢序列或發現,該序列號與上一個序列號之間有不同之處,
上一個序列號因為使用了 NOCACHE 所以oracle為分配快取任何序列號值,而這次建立的序列號在建立的時候為使用 NOCACHE 所以oracle預設快取了20個序列值。 orcle建議,在建立序列的時候儘量少了 NOCYCLE 。
利用 CREATE SEQUENCE 語句的 CACHE n 子句來說明讓oracle計算出 n 個序列號碼,並將它們放入記憶體當中,在一定程度上能加快訪問的速度。但是假如這個序列為共享的序列(多個使用者在使用)的話,那麼有可能某一個使用者獲得的序列號碼是有間隔的,並不是連貫性的。
使用該子句的話 oracle 做的操作包括
- 第一次引用這個序列時,oracle計算出 n 個序列號碼,並將它們放入記憶體當中。
- 每一個要求下一個序列號碼的請求,都將從記憶體中的序列號碼中得到。
- 當記憶體中的最後一個序列號碼用完之後,假如又收到下一個獲取序列號請求時,oracle伺服器再次計算出 n 個序列號並將它們放入記憶體當中。
NEXTVAL 和 CURRVAL偽列的使用規則。
使用規則
- 序列必須先定義才能使用 NEXTVAL,CURRVAL。
- 使用偽列 NEXTVAL 時會產生下一個新的序列號碼,並將該序列號碼放入 CURRVAL 偽列當中。
- 使用偽列 CURRVAL 可以獲取當前序列的系列號碼,使用之前必須在當前會話當中使用過 NEXTVAL 偽列產生過一個序列值。
使用場景
可使用場景
- 查詢語句的 SELECT 子句中,但不包括子查詢的 SELECT 子句。
- 在 UPDATE 語句的 SET 子句當中。
- 在 INSERT 語句中的子查詢的 SELECT 列表中。
- 在 INSERT 語句的 VALUES 子句中。
不能使用的場景
- 檢視的 SELECT 子句中,
- 在 SELECT 語句的子查詢中。
- 在 UPDATE 語句的子查詢當中。
- 在 DELETE 語句的子查詢中。
- 在包含 DISTINCT 關鍵字的查詢 SELECT 語句中。
- 在包含 ORDER BY 子句的查詢 SELECT 語句中。
- 在包含 GROUP BY 子句的查詢 SELECT 語句中。
- 在包含 HAVING 子句的查詢 SELECT 語句中。
- 在包含 DEFAULT 表示式的 CREATE TABLE 語句中。
- 在包含 DEFAULT 表示式的 ALTER TABLE 語句中。
序列的修改
修改序列號的語法跟建立序列的語法差不多,只不過 CREATE SEQUENCE 要變成 ALTER SEQUENCE,並且去掉了 START WITH 子句。 修改序列要注意幾點:- 必須要有 ALTER ANY SEQUENCE 系統許可權。
- 不能修改 START WITH 選項,如果一定要修改,只能刪掉序列,重新建立。
- ALTER SEQUENCE 只能影響以後的序列號碼。
- 修改後的 MAXVALUE 不能小於序列號當前的值。比如當縣序列號的值為 1000 ,那麼久不能修改 MAXVALUE 的值為 999。
刪除序列號
語法: DROP SEQUENCE 序列號名同義詞
在世紀工作中,我們經常會碰到一些表名稱很長的表,這個時候如果需要對該表進行查詢的話,那麼每一次查詢都需要輸入一次這個很長的表名,這無疑會使人感到很鬱悶,那麼oracle的同義詞就能幫我們解決這個問題。比如我們查詢一個表,表名比較長
SELECT * FROM supplier
有了同義詞之後可以這樣
SELECT * FROM s
建立同義詞
語法:CREATE [PUBLIC] SYNONYM 同義詞名字 FOR 物件名
- PUBLIC:使用了該欄位的話,那麼表明所有使用者都可以訪問這個同義詞
- 物件名:建立的同義詞基於的物件名。比如我們要為 supplier 表建立同義詞,那麼物件名就是該表名。
可以通過 user_synonym 表來查詢相關的同義詞資訊。
建立同義詞
CREATE SYNONYM s FOR supplier;
查詢同義詞資訊
CREATE SYNONYM s FOR supplier;
通過同義詞來查詢真是的表資料
SELECT * FROM s
可以看到 通過同義詞,我們查詢到了真是的 supplier 表中的資料。
因為沒有使用 PUBLIC 欄位,所以切換到別的使用者的時候,我們無法使用該同義詞。但是可以使用另外的方法來使用,比如該同義詞屬於 SCOTT 使用者,那麼在別的使用者下面我們可以使用 SCOTT.s 來使用該同義詞。
oracle沒有提供修改同義詞的方法,如果想要修改 ,只能刪除之後重新建立同義詞。
刪除同義詞
DROP SYNONYM 同義詞名稱