-----------------數據庫邏輯對象管理--------------------
ORACLE基本數據類型(亦叫內置數據類型 built-in datatypes)可以按類型分為:字符串類型、數字類型、日期類型、LOB類型、LONG RAW& RAW類型、ROWID & UROWID類型。
在講敘字符串類型前,先要講一下編碼。字符串類型的數據可依編碼方式分成數據庫字符集(CHAR/VARCHAR2/CLOB/LONG)和國際字符集(NCHAR/NVARCHAR2/NCLOB)兩種。數據庫中的字符串數據都通過字符集將字符轉換為數字後(二進制),才存儲到數據塊中。通過不同的編碼集轉換,即便是相同的字符,也可能會轉換成不同的二進制編碼。這也是產生亂碼的原因。數據庫的編碼格式一般是在創建數據庫時指定的。當然也可以修改數據庫的編碼。
查看數據庫視圖所包含的數據類型:SELECT * FROM DBA_TYPES WHERE OWNER IS NULL.具體細節情況參見Oracle? Database SQL Language Quick Reference 10/11g 或官方文檔
一 字符串類型
字符串數據類型還可以依據存儲空間分為固定長度類型(CHAR/NCHAR) 和可變長度類型(VARCHAR2/NVARCHAR2)兩種.
所謂固定長度:是指雖然輸入的字段值小於該字段的限制長度,但是實際存儲數據時,會先自動向右補足空格後,才將字段值的內容存儲到數據塊中。這種方式雖然比較浪費空間,但是存儲效率較可變長度類型要好。同時還能減少數據行遷移情況發生。
所謂可變長度:是指當輸入的字段值小於該字段的限制長度時,直接將字段值的內容存儲到數據塊中,而不會補上空白,這樣可以節省數據塊空間。
1.1:CHAR類型 CHAR(size [BYTE | CHAR])
CHAR類型,定長字符串,會用空格填充來達到其最大長度。非NULL的CHAR(12)總是包含12字節信息。CHAR字段最多可以存儲2,000字節的信息。如果創建表時,不指定CHAR長度,則默認為1。另外你可以指定它存儲字節或字符,例如 CHAR(12 BYTYE) CHAR(12 CHAR).一般來說默認是存儲字節,你可以查看數據庫參數
注意:數據庫的NLS_CHARACTERSET 為AL32UTF8,即一個漢字占用三到四個字節。如果NLS_CHARACTERSET為ZHS16GBK,則一個字符占用兩個字節。
如果串的長度小於或等於250(0x01~0xFA), Oracle 會使用1 個字節來表示長度。對於所有長度超過250 的串,都會在一個標志字節0xFE 後跟有兩個字節來表示長度。因此,如果有一個包含“Hello World”的VARCHAR2(80),則在塊中可能如圖12.-1 所示
clip_image002
1.2: NCHAR類型
這是一個包含UNICODE格式數據的定長字符串。NCHAR字段最多可以存儲2,000字節的信息。它的最大長度取決於國家字符集。另外查詢時,如果字段是NCHAR類型,則需要如下書寫
SELECT translated_description FROM product_descriptions
WHERE translated_name = N'LCD Monitor 11/PM';
1.3 VARCHAR類型
不要使用VARCHAR數據類型。使用VARCHAR2數據類型。雖然VARCHAR數據類型目前是VARCHAR2的同義詞,VARCHAR數據類型將計劃被重新定義為一個單獨的數據類型用於可變長度的字符串相比,具有不同的比較語義。
1.4: VARCHAR2類型
變長字符串,與CHAR類型不同,它不會使用空格填充至最大長度。VARCHAR2最多可以存儲4,000字節的信息。
1.5: NVARCHAR2類型
這是一個包含UNICODE格式數據的變長字符串。 NVARCHAR2最多可以存儲4,000字節的信息。
二. 數字類型
2.1 NUMBER類型
NUMBER(P,S)是最常見的數字類型,可以存放數據范圍為10^130~10^126(不包含此值),需要1~22字節(BYTE)不等的存儲空間。
P 是Precison的英文縮寫,即精度縮寫,表示有效數字的位數,最多不能超過38個有效數字
S是Scale的英文縮寫,可以使用的范圍為-84~127。Scale為正數時,表示從小數點到最低有效數字的位數,它為負數時,表示從最大有效數字到小數點的位數
2.2 INTEGER類型
INTEGER是NUMBER的子類型,它等同於NUMBER(38,0),用來存儲整數。若插入、更新的數值有小數,則會被四捨五入。
例如:
CREATE TABLE TEST
(
ID INTEGER
)
查看表TEST的DDL定義如下所示
CREATE TABLE "SYS"."TEST"
( "ID" NUMBER(*,0)
) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "SYSTEM" ;
INSERT INTO TEST
SELECT 12.34 FROM DUAL;
INSERT INTO TEST
SELECT 12.56 FROM DUAL;
SQL> SELECT * FROM TEST;
ID
----------
12
13
2.3 浮點數
浮點數可以有一個十進制數點任何地方從第一個到最後一個數字,或者可以在所有有沒有小數點。指數可能(可選) 用於以下數量增加的范圍 (例如, 1.777e-20)。刻度值不適用於浮點數字,因為可以顯示在小數點後的位數的數量不受限制。
二進制浮點數不同數量的值由 Oracle 數據庫內部存儲的方式。使用小數精度數存儲值。完全相同號碼存儲范圍和數量由支持的精度內的所有文本。正是因為使用小數精度(數字 0 到 9) 表示文本存儲文本。使用二進制精度 (數字 0 和 1) 存儲二進制浮點數。這種存儲方案不能代表所有確切地使用小數精度的值。頻繁地,將值從十進制轉換為二進制的精度時出現的錯誤時撤消值回從二進制轉換為十進制精度。在字面 0.1 是一個這樣的例子。
Oracle 數據庫提供了專為浮點數的兩種數值數據類型:
BINARY_FLOAT
BINARY_FLOAT 是 32 位、 單精度浮點數字數據類型。可以支持至少6位精度,每個 BINARY_FLOAT 的值需要 5 個字節,包括長度字節。
BINARY_DOUBLE
BINARY_DOUBLE 是為 64 位,雙精度浮點數字數據類型。每個 BINARY_DOUBLE 的值需要 9 個字節,包括長度字節。
在數字的列中,浮點數有小數精度。在 BINARY_FLOAT 或 BINARY_DOUBLE 的列中,浮點數有二進制的精度。二進制浮點數支持的特殊值無窮大和 NaN (不是數字)。
您可以指定列在表 2-4 范圍內的浮點數。"數字文本"中定義了用於指定浮點數的格式。
Table 2-3 Floating Point Number Limits
Value
Binary-Float
Binary-Double
Maximum positive finite value
3.40282E+38F
1.79769313486231E+308
Minimum positive finite value
1.17549E-38F
2.22507485850720E-308
2.5 FLOAT類型
FLOAT類型也是NUMBER的子類型。
Float(n),數 n 指示位的精度,可以存儲的值的數目。N 值的范圍可以從 1 到 126。若要從二進制轉換為十進制的精度,請將 n 乘以 0.30103。要從十進制轉換為二進制的精度,請用 3.32193 乘小數精度。126 位二進制精度的最大值是大約相當於 38 位小數精度。
三. 日期類型
日期類型用於存儲日期數據,但是並不是使用一般的格式(2012-08-08)直接存儲到數據庫的。
3.1 DATE類型
DATE是最常用的數據類型,日期數據類型存儲日期和時間信息。雖然可以用字符或數字類型表示日期和時間信息,但是日期數據類型具有特殊關聯的屬性。為每個日期值,Oracle 存儲以下信息: 世紀、 年、 月、 日期、 小時、 分鐘和秒。一般占用7個字節的存儲空間。
3.2 TIMESTAMP類型
這是一個7字節或12字節的定寬日期/時間數據類型。它與DATE數據類型不同,因為TIMESTAMP可以包含小數秒,帶小數秒的TIMESTAMP在小數點右邊最多可以保留9位
3.3 TIMESTAMP WITH TIME ZONE類型
這是TIMESTAMP類型的變種,它包含了時區偏移量的值
3.4 TIMESTAMP WITH LOCAL TIME ZONE類型
3.5 INTERVAL YEAR TO MOTH
3.6 INTERVAL DAY TO SECOND
四. LOB類型
內置的LOB數據類型包括BLOB、CLOB、NCLOB、BFILE(外部存儲)的大型化和非結構化數據,如文本、圖像、視屏、空間數據存儲。BLOB、CLOB、NCLOB類型
4.1 CLOB 數據類型
它存儲單字節和多字節字符數據。支持固定寬度和可變寬度的字符集。CLOB對象可以存儲最多 (4 gigabytes-1) * (database block size) 大小的字符
4.2 NCLOB 數據類型
它存儲UNICODE類型的數據,支持固定寬度和可變寬度的字符集,NCLOB對象可以存儲最多(4 gigabytes-1) * (database block size)大小的文本數據。
4.3 BLOB 數據類型
它存儲非結構化的二進制數據大對象,它可以被認為是沒有字符集語義的比特流,一般是圖像、聲音、視頻等文件。BLOB對象最多存儲(4 gigabytes-1) * (database block size)的二進制數據。
4.4 BFILE 數據類型
二進制文件,存儲在數據庫外的系統文件,只讀的,數據庫會將該文件當二進制文件處理
五. RAW & LONG RAW類型
5.1 LONG類型
它存儲變長字符串,最多達2G的字符數據(2GB是指2千兆字節, 而不是2千兆字符),與VARCHAR2 或CHAR 類型一樣,存儲在LONG 類型中的文本要進行字符集轉換。ORACLE建議開發中使用CLOB替代LONG類型。支持LONG 列只是為了保證向後兼容性。CLOB類型比LONG類型的限制要少得多。 LONG類型的限制如下:
1.一個表中只有一列可以為LONG型。(Why?有些不明白)
2.LONG列不能定義為主鍵或唯一約束,
3.不能建立索引
4.LONG數據不能指定正則表達式。
5.函數或存儲過程不能接受LONG數據類型的參數。
6.LONG列不能出現在WHERE子句或完整性約束(除了可能會出現NULL和NOT NULL約束)
用於存儲二進制或字符類型數據,變長二進制數據類型,這說明采用這種數據類型存儲的數據不會發生字符集轉換。這種類型最多可以存儲2,000字節的信息
六. ROWID & UROWID類型
在數據庫中的每一行都有一個地址。然而,一些表行的地址不是物理或永久的,或者不是ORACLE數據庫生成的。
例如,索引組織表行地址存儲在索引的葉子,可以移動。
例如,外部表的ROWID(如通過網關訪問DB2表)不是??標准的ORACLE的rowid。
ORACLE使用通用的ROWID(UROWIDs)的存儲地址的索引組織表和外表。索引組織表有邏輯urowids的,和國外表的外urowids,。UROWID這兩種類型的存儲在ROWID偽(堆組織的表的物理行id)。
創建基於邏輯的rowid在表中的主鍵。邏輯的rowid不會改變,只要主鍵不改變。索引組織表的ROWID偽UROWID數據類型。你可以訪問這個偽列,你會堆組織表的ROWID偽(即使用一個SELECT ...ROWID語句)。如果你想存儲的rowid索引組織表,那麼你就可以定義一列的表型UROWID到列檢索值的ROWID偽。
表約束
Oracle約束操作
約束是在表中定義的用於維護數據庫完整性的一些規則。通過為表中的字段定義約
束,可以防止將錯誤的數據插入到表中。
注意:
1.如果某個約束只作用於單獨的字段,既可以在字段級定義約束,也可以在表級定義約束;但如果某個約束將作用於多個字段,必須在表級定義約束。
2.oracle中的約束通過名稱來進行識別。在定義約束時可以通過constraint關鍵字為約束命名。如果用戶沒有為約束指定名稱,oracle將自動為約束建立默認的名稱。
主鍵約束(primary key):
主鍵約束的特點:
定義為主鍵約束的字段中不能包含任何重復值,並且不能包含null值。
同1個表中只能定義1個主鍵約束。
可以為一個字段定義主鍵約束,也可以為多個字段的組合定義主鍵約束。
oracle會自動為具有主鍵約束的字段建立1個唯一索引和1個非空約束。
例如:
create table person
(
p_id int primary key, --定義該字段為主鍵約束
p_name varchar2(20),
p_age int
--constraint p_pk primary key (p1_id)
);
create table person
(
p_id int constraint p_pk primary key, --定義該字段為主鍵約束,並指定約束名字
p_name varchar2(20),
p_age int
--constraint p_pk primary key (p1_id)
);
create table person
(
p_id int,
p_name varchar2(20),
p_age int,
constraint p_pk primary key (p_id,p_name)--定義復合主鍵,並指定名字
--primary key(p_id,p_name)
);
非空約束(not null):
非空約束的特點:
定義了非空約束的字段中不能包含null值。
只能在字段級定義非空約束。
在同一個表中可以定義多個非空約束。
例如:
create table person
(
p_id int,
p_name varchar2(20) not null, --定義該列的非空約束
p_age int
);
唯一約束(unique):
唯一約束的特點:
定義了唯一約束的字段中不能包含重復值。
可以為1個字段定義唯一約束,也可以為多個字段的組合定義唯一約束。因此,唯一約束既可以定義在字段級,也可以定義在表級。
oracle會自動為具有唯一約束的字段建立1個唯一索引。
對同一字段可以同時定義非空和唯一約束。
如果在1個字段上僅定義了唯一約束,而沒有定義非空約束,則該字段可以包含多個null值。
例如:
create table person
(
p_id int,
p_name varchar2(20) unique,--定義該列的唯一約束
p_age int
);
create table person
(
p_id int,
p_name varchar2(20) constraint p_un unique not null, --同時定義唯一和非空約束
p_age int
);
create table person
(
p_id int,
p_name varchar2(20),
p_age int,
constraint p_un unique(p_name) --指定約束名字
);
外鍵約束(foreign key)
外鍵約束的特點:
定義為外鍵約束的字段中只能包含相應的其他表中引用字段的值或null值。
可以為1個字段定義外鍵約束,也可以為多個字段的組合定義外鍵約束。
定義了外鍵約束的字段和相應的引用字段可以存在於同1個表中,稱為自引用。
對同1個字段可以同時定義外鍵和非空約束。
主表中的被引用列,必須有主鍵約束或唯一約束。
例如:
create table person
(
p_id int,
p_name varchar2(20),
p_age int,
w_id int,
constraint p_fk foreign key (w_id) references works(w_id) --外鍵約束
);
create table person
(
p_id int,
p_name varchar2(20),
p_age int,
w_id int constraint p_fk references works-- 外鍵約束,引用works表中的主鍵
);
create table person
(
p_id int,
p_name varchar2(20),
p_age int,
w_id int references works --外鍵約束
-- w_id int constraint w_fk references works(w_id)
);
在定義外鍵約束時,還可以通過on關鍵字來指定引用行為的類型。當主表中的一條記錄被刪除時,需要通過引用行為來確定如何處理子表中的外鍵列的值。
刪除子表中所有相關的記錄(delete cascade),
將所有相關記錄的外鍵值設置為null(delete set null)
檢查約束(check)
檢查約束的特點:
在檢查約束的表達式中必須引用到表中的一個或多個字段,並且表達式的計算結果必須是一個布爾值。
在表達式中不能包含子查詢。
在表達式中不能包含sysdate,uid,user,userenv等sql函數,也不能包含rowid,rownum等偽列。
檢查約束可以在字段級和表級定義。
對同一個字段可以定義多個檢查約束,而且對同一個字段可以同時定義檢查約束和非空約束。
例如:
create table person
(
p_id int,
p_name varchar2(20),
p_age int check(p_age > 20) --檢查約束
-- constraint p_check check(p_age > 20) --檢查約束
);
create table person
(
p_id int,
p_name varchar2(20),
p_age int constraint p_check check(p_age > 20) --檢查約束
-- constraint p_check check(p_age > 20) --檢查約束
);
增加約束
如果增加UNIQUE、PRIMARY KEY、FOREIGN KEY 和CKECK 必須使用ALTER TABLE語句的ADD子句;
如果增加NOT NULL約束,那麼必須使用ALTER TABLE語句的MODIFY子句,如:
ALTER TABLE table_name ADD [CONSTRAINT constraint_name]
constraint_type (column,...)
ALTER TABLE table_name MODIFY column
[CONSTRAINT constraint_name] NOT NULL;
添加外鍵約束
alter table emp add foreign key (deptno) references dept(deptno);
alter table emp add constraint d_fk foreign key (deptno) references dept(deptno);
添加主鍵約束
alter table table_name add primary key(column_name);
alter table table_name add constraint t_pk primary key(column_name);
添加非空約束
alter table person modify p_name not null;
alter table person modify p_name constraint t_notnull not null;
約束延遲(在事務提交時再驗證,默認為不延遲)
deferrable --延遲驗證
not deferrable --不延遲驗證(默認)
單獨deferrable的含義就是是否允許約束檢查延後進行。單獨設置deferrable為deferrable之後,約束檢查延後是不可以直接使用的,要配合deferred參數,如果該參數是immediate,那麼約束還是在DML的時候進行應用。如果deferred參數設置為deferred,約束就是在事務commit提交的時候應用,出現錯誤就連帶回滾rollback整個事務
創建約束時,可指定開啟延遲
create table tt
(
id int primary key deferrable initially deferred
);
set constraints 約束名 immediate; 關閉約束延遲
set constraints 約束名 deferred; 開啟約束延遲
也可以在session級設置
alter session set constraints=immediate;
alter session set constraints=deferred;
重命名約束
alter table 表名 rename constraint 原約束名 to 新約束名
刪除約束
alter table 表名 drop constraint 約束名;
alter table 表名 drop constraint 約束名 cascade; -?-刪除主鍵時級聯刪除子表的外鍵約束
約束失效
alter table 表名 disable constraint 約束名
alter table 表名 disable constraint 約束名cascade; --失效主鍵時級聯刪除子表的外鍵約束
約束生效
alter table 表名 enable constraint 約束名
novalidate: --不驗證老數據
validate:--驗證老數據
控制現有數據是否應用約束,例如
alter table t2 deferrable enable novalidate constraint SYS_C007211; -- 約束生效,不驗證已有數據是否符合約束條件
alter table t2 enable validate constraint SYS_C007211; -- 約束生效,同時驗證已有數據是否符合約束條件
alter table t2 disable validate constraint SYS_C007211;
--約束失效,同時驗證已有數據是否符合約束條件,之後不能對該表進行dml操作,否則會報ORA-25128錯誤
alter table t2 disable novalidate constraint SYS_C007211;
-- 約束失效,不驗證已有數據是否符合約束條件(默認)
注:約束生效(enable)後的操作都受約束的限制。
查詢約束信息
視圖名字 描述
all_constraints 包含所有的約束基本描述信息,包括約束的名字、類型、狀態、延遲性等信息
dba_constraints
user_constraints
all_cons_columns 包含定義課約束的字段信息,利用這個視圖可以查看約束定義在哪些字段上
dba_cons_columns
user_cons_columns
索引
在oracle中,索引是一種供服務器在表中快速查找一個行的數據庫結構。在數據庫中建立索引主要有以下作用。
(1)快速存取數據。
(2)既可以改善數據庫性能,又可以保證列值的唯一性。
(3)實現表與表之間的參照完整性
(4)在使用orderby、groupby子句進行數據檢索時,利用索引可以減少排序和分組的時間。
索引使用原則
在關系數據庫中,每一行都由一個行唯一標識RowID。RowID包括該行所在的文件、在文件中的塊數和塊中的行號。索引中包含一個索引條目,每一個索引條目都有一個鍵值和一個RowID,其中鍵值可以是一列或者多列的組合。
(一)索引按存儲方法分類,可以分為2類:B*樹索引和位圖索引。
(1)B*樹索引的存儲結構類似書的索引結構,有分支和葉兩種類型的存儲數據塊,分支塊相當於書的大目錄,葉塊相當於索引到的具體的書頁。Oracle用B*樹機制存儲索引條目,以保證用最短路徑訪問鍵值。默認情況下大多使用B*樹索引,該索引就是通常所見的唯一索引、逆序索引。
(2)位圖索引存儲主要用於節省空間,減少oracle對數據塊的訪問。它采用位圖偏移方式來與表的行ID號對應,采用位圖索引一般是重復值太多的表字段。位圖索引之所以在實際密集型OLTP(聯機事物處理)中用的比較少,是因為OLTP會對表進行大量的刪除、修改、新建操作。Oracle每次進行操作都會對要操作的數據塊加鎖。以防止多人操作容易產生的數據庫鎖等待甚至死鎖現象。在OLAP(聯機分析處理)中應用位圖有優勢,因為OLAP中大部分是對數據庫的查詢操作,而且一般采用數據倉庫技術,所以大量數據采用位圖索引節省空間比較明顯。當創建表的命令中包含有唯一性關鍵字時,不能創建位圖索引,創建全局分區索引時也不能用位圖索引。
(二)索引按功能和索引對象分還有以下類型。
(1)唯一索引意味著不會有兩行記錄相同的索引鍵值。唯一索引表中的記錄沒有RowID,不能再對其建立其他索引。在oracle10g中,要建立唯一索引,必須在表中設置主關鍵字,建立了唯一索引的表只按照該唯一索引結構排序。
(2)非唯一索引不對索引列的值進行唯一性限制。
(3)分區索引是指索引可以分散地存在於多個不同的表空間中,其優點是可以提高數據查詢的效率。
(4)未排序索引也稱為正向索引。Oracle10g數據庫中的行是按升序排序的,創建索引時不必指定對其排序而使用默認的順序。
(5)逆序索引也稱反向索引。該索引同樣保持列按順序排列,但是顛倒已索引的每列的字節。
(6)基於函數的索引是指索引中的一列或者多列是一個函數或者表達式,索引根據函數或表達式計算索引列的值。可以將基於函數的索引建立創建成位圖索引。
另外,按照索引所包含的列數可以把索引分為單列索引和復合索引。索引列只有一列的索引為單列索引,對多列同時索引稱為復合索引。
3索引使用原則編輯
在正確使用索引的前提下,索引可以提高檢索相應的表的速度。當用戶考慮在表中使用索引時,應遵循下列一些基本原則。
(1)在表中插入數據後創建索引。在表中插入數據後,創建索引效率將更高。如果在裝載數據之前創建索引,那麼插入每行時oracle都必須更改索引。
(2)索引正確的表和列。如果經常檢索包含大量數據的表中小於15%的行,就需要創建索引。為了改善多個表的相互關系,常常使用索引列進行關系連接。
(3)主鍵和唯一關鍵字所在的列自動具有索引,但應該在與之關聯的表中的外部關鍵字所在的列上創建索引。
(4)合理安排索引列。在createindex語句中,列的排序會影響查詢的性能,通常將最常用的列放在前面。創建一個索引來提高多列的查詢效率時,應該清楚地了解這個多列的索引對什麼列的存取有效,對什麼列的存取無效。
例如:在A,B,C三列上創建索引
A有效
AB有效
ABC有效
(5)限制表中索引的數量。盡管表可以有任意數量的索引,可是索引越多,在修改表中的數據時對索引做出相應更改的工作量也越大,效率也就越低。同樣,目前不用的索引應該及時刪除。
(6)指定索引數據塊空間的使用。創建索引時,索引的數據塊是用表中現存的值填充的,直到達到PCTFREE為止。如果打算將許多行插入到被索引的表中,PCTFREE就應設置得大一點,不能給索引指定PCTUSED。
(7)根據索引大小設置存儲參數。創建索引之前應先估計索引的大小,以便更好地促進規劃和管理磁盤空間。單個索引項的最大值大約是數據塊大小的一半。
簇和簇表
簇其實就是一組表,是一組共享相同數據塊的多個表組成。 將經常一起使用的表組合在一起成簇可以提高處理效率。
在一個簇中的表就叫做簇表。建立順序是:簇→簇表→數據→簇索引
1、創建簇的 格式
CREATE CLUSTER cluster_name
(column date_type [,column datatype]...)
[PCTUSED 40 | integer] [PCTFREE 10 | integer]
[SIZE integer]
[INITRANS 1 | integer] [MAXTRANS 255 | integer]
[TABLESPACE tablespace]
[STORAGE storage]
SIZE:指定估計平均簇鍵,以及與其相關的行所需的字節數。
2、創建簇
create cluster my_clu (deptno number )
pctused 60
pctfree 10
size 1024
tablespace users
storage (
initial 128 k
next 128 k
minextents 2
maxextents 20
);
3、創建簇表
create table t1_dept(
deptno number ,
dname varchar2 ( 20 )
)
cluster my_clu(deptno);
create table t1_emp(
empno number ,
ename varchar2 ( 20 ),
birth_date date ,
deptno number
)
cluster my_clu(deptno);
4、為簇創建索引
create index clu_index on cluster my_clu;
注:若不創建索引,則在插入數據時報錯:ORA-02032: clustered tables cannot be used before the cluster index is built
管理簇
使用ALTER修改簇屬性(必須擁有ALTER ANY CLUSTER的權限)
1、修改簇屬性
可以修改的簇屬性包括:
* PCTFREE、PCTUSED、INITRANS、MAXTRANS、STORAGE
* 為了存儲簇鍵值所有行所需空間的平均值SIZE
* 默認並行度
注:
* 不能修改INITIAL和MINEXTENTS的值
* PCTFREE、PCTUSED、SIZE參數修改後適用於所有數據塊
* INITRANS、MAXTRANS僅適用於以後分配的數據塊
* STORAGE參數修改後僅影響以後分配給簇的盤區
格式:
alter cluster my_clu
pctused 40
2、刪除簇
drop cluster my_clu; -- 僅適用於刪除空簇
drop cluster my_clu including tables ; -- 刪除簇和簇表
drop cluster my_clu including tables cascade constraints ;
-- 同時刪除外鍵約束
注:簇表可以像普通表一樣刪除。
散列聚簇表
在簇表中,Oracle使用存儲在索引中的鍵值來定位表中的行,而在散列聚簇表中,使用了散列函數代替了簇索引,先通過內部函數或者自定義的函數進行散列計算,然後再將計算得到的碼值用於定位表中的行。創建散列簇需要用到HASHKEYS子句。
1、創建散列簇
create cluster my_clu_two(empno number(10) )
pctused 70
pctfree 10
tablespace users
hash is empno
hashkeys 150 ;
說明:
* hash is 子句指明了進行散列的列,如果列是唯一的標示行,就可以將列指定為散列值
* hashkeys 指定和限制散列函數可以產生的唯一的散列值的數量
2、創建散列表
create table t2_emp (
empno number ( 10 ),
ename varchar2 ( 20 ),
birth_date date ,
deptno number )
cluster my_clu_two(empno);
注意:
* 必須設置數值的精度(具體原因不詳)
* 散列簇不能也不用創建索引
* 散列簇不能ALTER:size、hashkeys、hash is參數
應用場景126:在Enterprise Manager中創建表
應用情景127:使用CREATE TABLE語句創建表
創建表Employee表
CREATE TABLE HRMAN.Employees
(
Emp_id NUMBER,
Emp_name VARCHAR2(50) NOT NULL,
Sex VARCHAR2(2),
Title VARCHAR2(50),
Wage NUMBER(8, 2),
IdCard VARCHAR2(20),
Dep_id NUMBER
);