Oracle數據庫第六課——Oracle空間管理、索引和序列的創建

知識點:學習 Oracle 數據庫應用。主要學習如何創建表空間和用戶,同時介紹如何運用 索引、同義詞、序列等數據庫對象。

 

1、表空間管理

什麼是表空間?表空間是指 Oracle 數據庫內部數據的邏輯組織結構,對應於磁盤上的一個或多個物理數據文件。

表空間的作用?Oracle 通過表空間的數據庫對象來組織數據文件。在將數據插入 Oracle 數據庫之前,必須首先建立表空間,然後將數據插入表空間的一個對象中。

如何理解表空間?數據庫、表空間、數據文件、表、數據之間的關係可以用櫃子、抽屜、文件夾、紙,以及寫在紙上的信息的關係來描述。

數據庫就是櫃子,櫃中的抽屜是表空間,抽屜中的文件夾是數據文件,文件夾中的紙是表,寫在紙上的信息就是數據。即使在自己的櫃子中也不應該把保險單放在名叫“學校記錄”的抽屜中,而應放在名爲“保險”的抽屜。數據庫中的表空間也應使用類似的規則。

表空間的分類:永久性表空間、臨時性表空間、撤銷表空間。

  • 永久性表空間:一般保存表、視圖、過程和索引等的數據。SYSTEMSYSAUX、 USERSEXAMPLE 表空間是默認安裝的。
  • 臨時性表空間:只用於保存系統中短期活動的數據,如排列數據等。
  • 撤銷表空間:用來幫助回退未提交的事務數據,已提交了的數據在這裏是不可以恢復的。一般不需要創建臨時和撤銷表空間,除非把他們轉移到其他磁盤中以提高性能。

        對不同的用戶分配不同的表空間,對不同的模式對象分配不同的表空間,方便對用戶數據的操作,對模式對象的管理。可以將不同數據文件創建到不同的磁盤中,有利於管理磁盤空間,有利於提高 I/O 性能,有利於備份和恢復數據等。一般在完成 Oracle 系統的安裝並創建 Oracle 實例後,Oracle 系統會自動建立多個表空間。

 

1.1  創建表空間

         每個數據庫創建的時候,系統都會默認地爲它創建一個 SYSTEM 表空間,一個數據庫 可以有若干表空間,也可以只有一個 SYSTEM 表空間。邏輯上的方案對象,如數據表、索引等既可以存儲在物理上的一個數據文件內,也可以跨越物理上的數據文件,但必須屬於同一個表空間。 創建表空間語法:

create tablespace tablespace_name
    datafile ‘file_name’ [SIZE integer [K | M] ]
[AUTOEXTend [OFF | ON]];

語法說明:

  • tablespace_name:表空間名稱。
  • DATAFILE:指定組成表空間的一個或多個數據文件,當有多個數據文件時使用逗號分隔。
  • file_name:指數據文件的路徑和名稱。
  • SIZE:指定文件的大小,用 K 指定千字節大小,用 M 指定兆字節大小。
  • AUTOEXTEND :用來啓用或禁用數據文件的自動擴展,設置爲 ON 則空間使用完畢會 自動擴展,設置爲 OFF 則很容易出現表空間剩餘容量爲 0 的情況,使數據不能存儲到數據庫中。

示例練習1:創建一個自動增長的表空間workdbs

第一步:使用系統賬戶system登錄PLSQL Developer(system 密碼manager

第二步:單擊菜單欄【文件】——【新建】——【SQL Window】,並輸入語句:

create tablespace worktbs   --創建表空間,表空間的名字是worktbs
       datafile 'D:\oracle\worktbs1.dbf'  --指定表空間存放的位置,這裏要寫完整路徑,帶上表空間的全稱
       size 3M    --指定表空間的大小
       autoextend ON;   --設置表空間自增長開啓(也就是允許自增長)

第三步:單擊工具欄上的執行按鈕,提示“已完成”。然後打開本地電腦磁盤對應文件夾,查看文件。

 

1.2  刪除表空間

         刪除表空間語法: DROP TABLESPACE 表空間名;

示例練習2:刪除表空間workdbs

寫完以後,點擊工具欄執行按鈕即可,提示“已完成”,代表已刪除該表空間。

注意:使用drop方法刪除表空間時,表空間的物理文件是不會被刪除的,需要手工來刪除。

提醒:刪除表空間之前最好對數據庫進行備份。

 

2、SQL語言基礎(DML,DDL)

2.1   SQL 語言簡介

        SQL 語言是高級的結構化查詢語言。用戶使用 SQL 語言進行數據操作時,只需要提出“做什麼,而不必指明怎麼做”,具體的執行過程有系統自動完成,大大減輕了用戶負擔。SQL 語言是數據庫服務器和客戶端之間的重要溝通手段,用於存取數據以及查詢、更新和管理關係型數據庫系統。 經過多年的發展,SQL 語言已經成爲關係型數據庫的標準語言。SQL 支持如下類別的命令。

  •   數據定義語言(DDL):CREATE(創建)、ALTER(更改)TRUNCATE(截斷)、 DROP(刪除)命令。
  •   數據操作語言(DML):INSERT(插入)、SELECT(選擇)、DELETE(刪除)和 UPDATE(更新)命令。
  •   事務控制語言(TCL):COMMIT(提交)SAVEPOINT(保存點)ROLLBACK(回滾)命令。
  •   數據控制語言(DCL):GRANT(授予)REVOKE(回收)命令。

2.2 DDL 語言

       數據定義語言中,CREATE TABLE 語句用來創建新表、ALTER TABLE 語句用來修改結構,TRUNCATE TABLE 語句用來刪除表中的所有記錄,DROP TABLE 語句用來刪除表。本章結合以前學過的 DDL 語言知識,主要介紹數據定義語言中常用的 CREATE TABLE 命令和較爲陌生的 TRUNCATE TABLE 命令。

(1)CREATE TABLE 命令語法:

CREATE TABLE [schema.] table_name
(
    column_name1 datatype1,
    [column_name2 datatype2],
    ……
)

語法說明:

  • schema 表示對象的所有者,即模式的名稱。如果用戶在自己的模式中創建表,則可以不指定所有者名稱。
  • table_name:表示表名稱。
  • column_name1:表示列名稱。
  • datatype:表示該列的數據類型及其寬度。
  • 創建表時,需要指定唯一的表名稱,表內唯一的列名稱、列的數據類型及其寬度。

 

示例練習3:創建一個學員信息表stuInfo

第一步:使用系統賬號登錄PLSQL Developer(system 密碼manager)

第二步:單擊菜單欄【文件】——【新建】——【SQL Window】,並輸入語句:

create table stuInfo    --創建學員信息表stuInfo
(
   stuNo char(6) primary key ,    --學員編號列,主鍵
   stuName varchar2(20) not null, --學員姓名列,非空
   stuAge number(3,0) not null,   --學員年齡列,3位數字,小數位是0,非空
   stuId number(18,0),            --學員身份證列,18位數字,小數位是0
   stuSeat number(2,0)            --學員座位列,2位數字,小數位是0
);

代碼分析:創建表時,表名嚴格遵循以下列名規則

  •   表名首字符應該爲字母。
  •   不能使用 Oracle 保留字來爲表名命名。
  •   表名的最大長度爲 30 個字符。
  •   同一用戶模式下的不同表不能具有相同的名稱。
  •   可以使用下劃線、數字和字母,但是不能使用空格和單引號。

提示: Oracle 中的表名(還有列名、用戶名和其他對象名)不區分大小寫,系統會自動轉換成大寫。 Oracle 中也有 varchar 數據類型,但不建議使用,建議使用 varchar2,該數據類型是Oracle 標準數據類型。

第三步:單擊工具欄上的執行按鈕,提示“已完成”。

思考一個問題:我們創建的表,存放在哪個表空間裏?

select tablespace_name,table_name from user_tables where table_name=upper('stuInfo');

注意:建表未指定表空間,那麼表會存在默認表空間中,默認表空間是你創建數據庫的時候指定的那個表空間,一般都是SYSTEM的表空間。 

案例延伸:oracle 創建表時 指定表表空間

方法:可以直接在創建表的語句後面追加“tablespace name”進行表空間指定。

sql語句:create table tablename(id int) tablespace tablespacename;

解釋:在表空間“tablespacename”上創建表“tablename”。以上語句就實現了爲表指定表空間。

 

 

(2)TRUNCATE TABLE 命令命令語法:

TRUNCATE TABLE 表名;

        如果存儲在表中的數據不再使用,可以只刪除表中的記錄而不刪除表結構。使用 TRUNCATE TABLE 命令將刪除表中的所有行且不記錄日誌,所以與 DELETE 命令刪除表中記錄相比較節省資源,執行速度也較快。

 

2.3  DML 語言

         數據操縱語言用於檢索、插入和修改數據庫信息。它是最常用的 SQL 命令,如 INSERT(插入)SELECT(選擇)DELETE(刪除)和 UPDATE(更新)。在學習 SQL Server 中已經詳細介紹過了,這裏只做補充介紹。

示例練習4:向學員信息表stuInfo中插入5行數據

第一步:在上面案例的基礎上,在【SQL Window】,繼續輸入語句:

--向表中插入數據
insert into stuInfo
select 1,'張三',18,null,1 from dual union
select 2,'李四',20,null,2 from dual union
select 3,'王五',15,null,3 from dual union
select 4,'張三',18,null,4 from dual union
select 5,'張三',20,null,5 from dual ;

第二步:點擊工具欄上的執行按鈕,會提示“5行被插入”

案例思考:查詢我們表中的所有數據

 

2.3.1  從語法角度介紹DML 語言操作

1) 查詢無重複的行

要防止選擇重複的行,可以在 SELECT 命令中包含 DISTINCT 子句。

例如:不重複顯示所有學員的姓名和年齡

--查詢表中不重複的姓名和年齡
select distinct stuName , stuAge from stuInfo ;

注意:distinct 子句篩除結果集中內容全部相同的行,(如題,姓名爲張三,年齡 爲 18 的信息有兩條)僅保留其中一行。

 

2) 帶條件和排序的 SELECT 命令

         要從表中選擇特定的行,可以在 SELECT 命令中包含 WHERE 子句。它只能出現 在 FROM 子句後面,而且只檢索符合 WHERE 條件的行。若要根據某個預定義的順序 排列顯示行,可以使用 ORDER 子句。它還可以用來以升序或降序來排列行和排列多個列。

例如:查詢年齡大於17的學員,按照姓名升序排序,如果姓名相同,則按照年齡降序排序。

--查詢年齡大於17的學員,按照姓名升序排序,如果姓名相同,則按照年齡降序排序。
select stuNo,stuName,stuAge
from stuInfo
where stuAge>17
order by stuName ASC ,stuAge DESC;

 

3) 使用列別名

        列別名爲列表達式提供的另一個名稱,並顯示在列標題中。列別名不會影響列的實際名稱。列別名位於表達式後面。

例如:使用別名顯示姓名、年齡和身份證號列。

--使用別名顯示姓名、年齡和身份證號列。
select stuName as "姓 名",stuAge as "_年齡",stuId as 身份證號
from stuInfo;

注意:如果列別名中指定含有特殊字符(如空格)的列標題使用雙引號括起來。

 

4) 利用現有的表創建新表

Oracle 允許利用現有的表創建新表。 語法:

CREATE TABLE 新表名
AS 
SELECT *|所需列名
FROM 現有表 [WHERE 條件]

此命令可以把現有表中的所有記錄複製到新表中,也可以僅複製選定的列或只複製結構而不復制記錄。

例如:創建 newStuInfo 表,拷貝 stuInfo 表及其所有記錄。

--創建 newStuInfo 表,拷貝 stuInfo 表及其所有記錄。
create table newStuInfo
As 
Select * from stuInfo;

--查詢新表newStuInfo
Select * from newStuInfo;

例如:創建 newStuInfo 表,它具有來自 stuInfo 表的學員姓名、學員編號和年齡的所有記錄。

--創建 newStuInfo2 表,它具有來自 stuInfo 表的學員姓名、學員編號和年齡的所有記錄。
create table newStuInfo2
As 
Select stuName,stuNo,stuAge from stuInfo;

--查詢新表newStuInfo2
Select * from newStuInfo2;

例如:創建 newStuInfo3 表,僅僅複製表結構,而不復制記錄。

--創建 newStuInfo3 表,僅僅複製表結構,而不復制記錄。
create table newStuInfo3
As 
Select * from stuInfo where 1=2;

--查詢新表newStuInfo3
Select * from newStuInfo3;

 

2.3.2.從使用技巧的角度介紹 DML 語言操作

1)查看錶中行數

--查看錶中行數
select count(*) from stuInfo;--效率較低
select count(1) from stuInfo;--效率較高

2)取出 stuName,stuAge 列不存在重複數據的記錄

--取出 stuName,stuAge 列不存在重複數據的記錄
select stuName,stuAge
From stuInfo
Group by stuName,stuAge
Having (count(stuName||stuAge) <2);

代碼說明:||”操作符爲連接操作符,用於將兩個或多個字符串合併成一個字符串,或將一個字符串與一個數值合併在一起,類似 SQL Server 中的“+”,將兩部分內容連接在一起。例子中 count 函數中的參數只能有一個,所以用連接操作符做連接。

3) 查看當前用戶所有數據量>100 萬的表的信息

--查看當前用戶所有數據量>100 萬的表的信息
select table_name
From user_all_tables a
Where a.num_rows>1000000;

提示:user_all_tables 爲系統提供的數據視圖,使用者可以通過查詢該視圖獲得當前用戶表的描述。

 

3、  從語法角度介紹DML 語言操作

3.1    什麼是索引

         索引是與表關聯的可選結構,是一種快速訪問數據的途徑,可提高數據性能。

         索引的作用:快速訪問數據。

         如果《新華字典》是一張表,那麼索引相當於《新華字典》中的目錄。如果沒有索引,查詢數據的時候,就採用逐一匹配的方式進行查詢。如果存在索引,查詢數據的時候,就可以直接根據索引來查詢數據,從而加快查詢速度。

        數據庫可以明確地創建索引,以加快對錶執行 SQL 語句的速度。當索引鍵作爲查詢條件時,該索引將直接指向包含這些值的行的位置。即便刪除索引,也無需修改任何 SQL 語句的定義。

3.2   索引的分類

        在 Oracle 中,索引的分類如表所示:

             物理分類

           邏輯分類

分區或非分區索引

單列或組合索引

B樹索引(標準索引)

唯一或非唯一索引

正常或反向鍵索引

基於函數索引

位圖索引

 

(1)  B 樹索引

         B 樹索引通常也稱爲標準索引。索引的頂部爲根,其中包含指向索引中下一級的項。下一級爲分支塊,分支塊又指向下一級的塊。最低一級爲葉節點,其中包含指向錶行的索引項。 葉塊爲雙向鏈接,有助於按關鍵字值的升序和降序掃描索引。 創建普通索引的語法:create index 索引名 on 表名(列名);

CREATE [UNIQUE] INDEX index_name 
ON table_name(column_list) 
[TABLESPACE tablespace+name];

語法說明:

  • UNIQUE:用於指定唯一索引,默認情況下爲非唯一索引。
  • index_name:指所創建索引的名稱。
  • table_name:表示爲之創建索引的表名。
  • column_list:在其上創建索引的列名的列表,可以基於多列創建索引,列之間用逗號分割。
  • Tablesapce_name:爲索引指定表空間。

3.3   索引的原理

        create index emp_index_sal on emp(sal);
1)表裏數據按索引字段,從小到大排序
2)取出兩個字段:索引字段(sal)和rowid
3)把這兩個字段的的結果集保存在一張特殊的表裏——索引表
4)創建一棵樹Btree——二叉樹

說明:oracle數據庫的表中的每一行數據都有一個唯一的標識符,稱爲rowid,在oracle內部通常就是使用它來訪問數據的。

3.4   創建索引的原則

        創建索引時需遵循的原則:

1. 頻繁搜索的列可以作爲索引。

2. 經常排序、分組的列可以作爲索引。

3. 經常用作連接的列(主鍵/外鍵)可以作爲索引。

4. 將索引放在一個單獨的表空間中,不要放在有回退段、臨時段和表的表空間中。

5. 對大型索引而言,考慮使用 NOLOGGING 子句創建大型索引。

6. 根據業務數據發生的頻率,定期重新生成或重新組織索引,並進行碎片整理。

7. 僅包含幾個不同值的列不可以創建爲 B 數索引,根據需要創建位圖索引。

8. 不要在僅包含幾行的表中創建索引。

 

3.5   刪除索引

(1)DROP INDEX 語句用於刪除索引

例如:刪除員工表(emp)表中的 index_bit_job 位圖索引:

drop Index index_bit_job;

注意:SQL Server 中創建或刪除索引時,必須指明表的名稱和索引名稱。而 Oracle 索引名在用戶賬戶中是唯一的,刪除時不需要指定表名。

(2)何時應刪除索引

  • 應用程序不再需要索引。
  • 執行批量加載前刪除索引。大量加載數據前刪除索引,加載後再重建索引有以下好處:提高加載性能、更有效地使用索引空間。
  • 索引已損壞。

 

3.6   重建索引

(1)ALTER INDEX ……REBUILD 語句用於重建索引

例如,將反向鍵索引更改爲正常的 B 樹索引。

alter index index_reverse_empno rebuild noreverse;

(2)何時應重建索引

  •  用戶表被移動到新的表空間後,表上的索引不是自動移動,需要將索引移到指定表空間。
  •  索引中包含很多已刪除的項。對錶進行頻繁刪除,造成索引空間浪費,可以重建索引。
  •  需將現有正常索引轉換成反向鍵索引。

示例練習4:練習索引的使用

第一步:使用系統賬號登錄PLSQL Developer(system 密碼manager),創建一個用戶wang,密碼123,並授予該用戶connect和resource角色。

--創建一個用戶wang,密碼123
create user wang identified by 123 ;

--給用戶授予connect和resource角色
grant connect,resource to wang;

第二步:使用新創建的用戶wang登錄PLSQL Developer,新建一個SQL窗口,並創建表stu

第三步:創建一個序列,用來製作id列的自增長。

第四步:使用循環,向stu表中插入5000000行數據。(耗時會較長)

第五步:沒有索引前,查詢stu表中sals=1500的數據

第六步:創建一個索引

第七步:再次查詢stu表中sals=1500的數據,對比兩次查詢的耗時。

多次查詢stu表中sals=1500的數據,注意觀察時間。

本案例完整代碼:

--1、創建一個表stu
create table stu
(
 id number(10,0),
 name varchar2(20),
 sals number(4,0)
)

--2、創建一個序列,用來作爲id和name
create sequence stu_stuId;

--3、循環插入數據到表stu裏
begin
  for i in 1 .. 5000000 loop
    insert into stu(id,name,sals)
    values(stu_stuId.Nextval,stu_stuId.Currval,dbms_random.value(800,5000));
  end loop;
end;

--4、沒有索引前,查詢stu表中sals=1500的數據,記住耗時
select * from stu where sals=1500;


--5、創建索引
create index stu_sal on stu(sals);

--6、索引創建成功後,再次執行第4步的操作,對比耗時

代碼分析:dbms_random.value函數 該函數用來產生一個隨機數,有兩種用法:

  1. 產生一個介於0和1之間(不包含0和1)的38位精度的隨機數,語法爲:dbms_random.value return number;這種用法不包含參數。
  2. 產生一個介於指定範圍之內的38位精度的隨機數,語法爲:dbms_random.value(數字1,數字2);這種用法包含兩參數,數字1用來指定要生成的隨機數的下限,數字2指定上限,生成的隨機。請注意生成的隨機數有可能等於下限,但絕對小於上限,即“low<=隨機數<high”。

 

4、  同義詞

         同義詞是使用對象的一個別名,不佔用任何實際存儲空間,只是在 Oracle 的數據字典中保存其定義描述。在使用同義詞時,Oracle 會將其翻譯爲對應對象的名稱。

4.1   同義詞用途

  •  簡化 SQL 語句。
  •  隱藏對象的名稱和所有者。
  •  爲分佈式數據庫的遠程對象提供了位置透明性。
  •  提供對對象的公共訪問。

4.2  同義詞分類

  •  私有同義詞
  •  共有同義詞

        私有同義詞只能被被當前模式的用戶訪問。私有同義詞名稱不可與當前模式對象名稱相同。在當前模式下創建私有同義詞,用戶必須擁有 CREATE SYNONYM 系統權限。要在其他用戶模式下創建私有同義詞的語法:

第一步: 同義詞的創建需要有創建同義詞的權利。 system 賦予你: grant create (public) synonym to 用戶名;

第二步:使用語句創建。

create [ or replace ] synonym 同義詞名 for 同義詞指的代內容; --創建私有同義詞

create [ or replace ] public synonym 同義詞名 for 同義詞指代的內容;--創建公有同義詞

語法說明:

  • or replace:表示在同義詞存在的情況下替換該同義詞。
  • synonym_name:表示要創建的同義詞的名稱。
  • object_name:指定要爲之創建同義詞的對象的名稱。

 

4.3  公有同義詞和私有同義詞的區別

  •  私有同義詞只能在當前模式下訪問,且不能與當前模式的對象同名。
  •  公有同義詞可被所有的數據庫用戶訪問。

注意:

         使用同義詞前,要獲得同義詞對應對象的訪問權限。

        對象(如表)、私有同義詞、公有同義詞是否可以三者同名?對象與私有同義詞不能同名;對象和公有同義詞同名時,數據庫有限選擇對象作爲目標,私有同義詞和公有同義詞同名時,數據庫優先選擇私有同義詞作爲目標。

4.4   刪除同義詞

       DROP SYNONYM 語句用於從數據庫中刪除同義詞。要刪除同義詞,用戶必須擁有相應的權限。

  • 刪除同義詞也要有刪除同義詞的權限 drop (public)synonym;
  • 刪除私有同義詞:drop synonym 同義詞名;
  • 刪除公有同義詞:drop public synonym 同義詞名;

示例練習5:練習同義詞的使用

第一步:使用系統賬號登錄PLSQL Developer(system 密碼manager),給用戶wang授予訪問SCOTT用戶下emp表的權限。

--給用戶wang授予訪問SCOTT用戶下的emp表的權限
grant select on SCOTT.emp to wang;

--給用戶wang授予創建同義詞的權限
grant create synonym to wang;

第二步:使用用戶wang登錄PLSQL Developer,新建一個SQL窗口,沒有

第三步:創建一個同義詞sy_emp

第四步:使用同義詞時,訪問SCOTT用戶下的emp表

本案例完整代碼:

--沒有同義詞時,訪問SCOTT用戶下的emp表
select * from scott.emp;

--創建一個同義詞sy_emp
create synonym sy_emp for scott.emp;

--使用同義詞時,訪問SCOTT用戶下的emp表
select * from sy_emp;

 

5、 序列

        數據庫表中的主鍵值有的時候我們會用數字類 型的並且自增。這樣mysql、sql server中的都可以使用工具創建表的時候很容 易實現。但是oracle中沒有設置自增的方法,一般情況我們會使用序列和觸發器來實現主鍵自增的功能。

5.1  什麼是序列

         序列是oacle提供的,用於產生一系列唯一數字的數據庫對象序列通常用來自動生成主鍵或唯一鍵的值。序列可以按升序排列,也可以按降序排列。

5.2   序列的作用

  • 自動提供唯一的數值
  • 共享對象
  • 主要用於提供主鍵值
  • 將序列值裝入內存可以提高訪問效率

5.3  怎麼創建序列

        序列式用來生成唯一、連續的整數的數據庫對象。例如,銷售流水中的流水號可以使用序列自動生成。創建序列的語法:

CREATE SEQUENCE sequence_name
[START WITH integer]
[INCREMENT BY integer]
[MAXVALUE integer|NOMAXVALUE]
[MINVALUE integer|NOMINVALUE]
[CYCLE|NOCYCLE]
[CACHE integer|NOCACHE];

語法說明:

  • start with:指定要生成的第一個序列號。對於升序序列,其默認值爲序列的最小值;對於降序序列,其默認值爲序列的最大值。
  • increment by:用於指定序列號之間的間隔,其默認值爲 1。如果 n 爲正值,則生成的序列將按照升序排列;如果 n 爲賦值,則生成的序列將按降序排列。
  • maxvalue:指定序列可以生成的最大值。
  • NOMAXVALUE:如果指定了 NOMAXVALUE,Oracle 將升序序列的最大值設爲 1027,將降序序列的最大值設爲-1.這是默認選項。
  • minvalue:指定序列的最小值。MINVALUE 必須小於或者等於 START WITH 的值,並且必須小於 MAXVALUE
  • NOMINVALUE:如果指定了 NOMINVALUEOracle 將升序序列的最小值設爲 1,將降序序列的最小值設爲-1026,這是默認選項。
  • cycle:指定序列在達到最大值或最小值後,將繼續從頭開始生成值。
  • NOCYCLE:指定序列在達到最大值或最小值後,將不能再繼續生成值。這是默認選項。
  • cache:使用 CACHE 選項可以預先分配一組序列號,並將其保留在內存中,這樣可以更快的訪問序列號。當用完緩存中的所有序列號時,Oracle 將生成另一組數值,並將其保留在緩存中。
  • NOCACHE:使用 NOCACHE 選項,則不會爲加快訪問速度而預先分配序列號。如果在創建序列時忽略了 CACHE NOCACHE 選項,Oracle 將默認緩存 20 個序列號。

例如:創建序列seq1。從序號 10 開始,每次增加 1,最大爲 2000,不循環,再增加會報錯,緩存 30 個序列號。

create sequence seq1
start with 10
increment by 1
maxvalue 2000
nocycle
cache 30;

 

示例練習6:練習序列的使用

第一步:創建一個表stuInfo,輸入SQL語句後,單擊工具欄的執行按鈕。

第二步:創建一個序列seq_stuInfo,輸入SQL語句,然後單擊工具欄的執行按鈕。

第三步:使用序列seq_stuInfo,向stuInfo表中插入一行數據

代碼說明:oracle數據庫中nextval用來獲取序列號的下一個squence的值。

第四步:查詢表stuInfo中的數據,發現插入一條語句。

示例完整代碼:

--創建一個表
create table stuInfo
(
  id number(6) primary key,
  name varchar2(30)
);

--創建一個序列
create sequence seq_stuInfo
start with 10
increment by 1
maxvalue 2000
nocycle
nocache;

--使用序列插入數據
insert into stuInfo values(seq_stuInfo.Nextval,'mingzi');

--查詢表中數據
select * from stuInfo;

 

5.4  訪問序列

創建了序列之後,可以通過 NEXTVAL CURRVAL 僞列來訪問該序列的值。可以從

僞列中選擇值,但是不能操縱他們的值。下面分別說明 NEXTVAL CURRVAL

  • NEXTVAL創建序列後第一次使用 NEXTVAL 時,將返回該序列的初始值。以後再引用 NEXTVAL 時,將使用 INCREMENT BY 子句來增加序列值,並返回這個新值。
  • CURRVAL返回序列的當前值,即最後一次引用 NEXTVAL 時返回的值。

 

5.5  更改序列

        ALTER SEQUENCE 命令用於修改序列的定義。如果執行下列操作,則會修改序列。

  •   設置或刪除 MINVALUE MIAXVALUE
  •   修改增量值。
  •   修改緩存中序列號的數目。

更改序列的語法:

ALTER SEQUENCE [schema.]sequence_name
[INCREMENT BY integer]
[MAXVALUE integer|NOMAXVALUE]
[MINVALUE integer|NOMINVALUE]
[CYCLE|NOCYCLE]
[CACHE integer|NOCACHE];

注意:不能修改序列的 START WITH 參數。在修改序列時,應注意升序序列的最小值應小於最大值。

 

5.5    刪除序列

         DROP SEQUENCE 命令用於刪除序列。還可以使用此語句重新開始一個序列,方法是先刪除序列,然後在重新創建該序列。例如,一個序列的當前值爲 100,現在想用值 25 重新開始此係列。此時,先可以刪除此序列,然後以相同的名稱重新創建它,並將 START WITH 參數設置爲 25。

刪除序列的語法:DROP SEQUENCE [schema.]sequence_name;

 

5.6   使用序列

        可以使用序列設置 Oracle 的主關鍵字,所得值爲從給定的起點開始的一系列整數值。序列所生成的數字只能保證在單個實例裏是唯一的,這就不適合將它用作並行或者遠程環境裏的關鍵字,因爲各自環境裏的序列可能會生成相同的數字,從而導致衝突的發生。所以在不需要並行的環境中,可選擇使用序列作爲關鍵字。

       還可以使用 SYS_GUID 函數生成 32 位的唯一編碼作爲主鍵。它源自不需要對數據庫進行訪問的時間戳和機器標識符,這回保證創建的標識符在每個數據庫裏的都是唯一的。但管理 SYS_GUID 生成的值必將困難,所以除非是在一個並行的環境裏或者希望避免使用序列的情況下,才選擇 SYS_GUID 來設置主關鍵字。 可以多運行幾次以下代碼來觀察結果的變化。

SELECT SYS_GUID() FROM dual;

提示: 使用序列設置主關鍵字時,在數據庫遷移時需要特別注意。由於遷移後的表中已經存在數據,如果不修改序列的起始值,將會在表中插入重複數據,違背主鍵約束。所以,在創建序列時要修改序列的起始值。

 

 

 

 

 

========這裏是結束分割線=========

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章