建表一般來說是個(gè)挺簡單的事情,但是Oracle的建表語句有很多可選的參數(shù),有些我們可能平時(shí)不太用,用的時(shí)候又不知道怎么用,這里就寫一個(gè)較完整的建表的例子:
CREATE TABLE banping
(id NUMBER(5)
CONSTRAINT banping_id_pk PRIMARY KEY,
last_name VARCHAR2(10)
CONSTRAINT banping_last_name_nn NOT NULL,
first_name VARCHAR2(10) NOT NULL UNIQUE,
userid VARCHAR2(8)
CONSTRAINT banping_userid_uk UNIQUE,
start_date DATE DEFAULT SYSDATE,
title VARCHAR2(10),
dept_id NUMBER(7)
CONSTRAINT banping_dept_id_fk REFERENCES dept(id),
salary NUMBER(11,2),
user_type VARCHAR2(4)
CONSTRAINT banping_user_type_ck CHECK
(user_type IN('IN','OUT')),
CONSTRAINT banping_uk_title UNIQUE (title,salary)
)
INITRANS 1 MAXTRANS 255
PCTFREE 20 PCTUSED 50
STORAGE( INITIAL 1024K NEXT 1024K PCTINCREASE 0 MINEXTENTS 1 MAXEXTENTS 5)
TABLESPACE data
;
解釋說明如下:
語法
CREATE TABLE [schema.]table
(column datatype [, column datatype] … )
[TABLESPACE tablespace]
[PCTFREE integer]
[PCTUSED integer]
[INITRANS integer]
[MAXTRANS integer]
[STORAGE storage-clause]
[LOGGING | NOLOGGING]
[CACHE | NOCACHE] ];
Schema:表的所有者
Table:表名
Column:字段名
Datatype:字段的數(shù)據(jù)類型
Tablespace:表所在的表空間
Pctfree:為了行長度增長而在每個(gè)塊中保留的空間的量(以占整個(gè)空間減去塊頭部后所剩余空間的百分比形式表示),當(dāng)剩余空間不足pctfree時(shí),不再向該塊中增加新行。
Pctused:在塊剩余空間不足pctfree后,塊已使用空間百分比必須小于pctused后,才能向該塊中增加新行。
INITRANS:在塊中預(yù)先分配的事務(wù)項(xiàng)數(shù),缺省值為1
MAXTRANS:限定可以分配給每個(gè)塊的最大事務(wù)項(xiàng)數(shù),缺省值為255
STORAGE:標(biāo)識決定如何將區(qū)分配給表的存儲子句
LOGGING:指定表的創(chuàng)建將記錄到重做日志文件中。它還指定所有針對該表的后續(xù)操作都將被記錄下來。這是缺省設(shè)置。
NOLOGGING:指定表的創(chuàng)建將不被記錄到重做日志文件中。
CACHE:指定即使在執(zhí)行全表掃描時(shí),為該表檢索的塊也將放置在緩沖區(qū)高速緩存的LRU列表最近使用的一端。
NOCACHE:指定在執(zhí)行全表掃描時(shí),為該表檢索的塊將放置在緩沖區(qū)高速緩存的LRU列表最近未使用的一端。
STORAGE子句:
INITIAL:初始區(qū)的大小
NEXT:下一個(gè)區(qū)的大小
PCTINCREASE:以后每個(gè)區(qū)空間增長的百分比
MINEXTENTS:段中初始區(qū)的數(shù)量
MAXEXTENTS:最大能擴(kuò)展的區(qū)數(shù)
如果已為表空間定義了MINIMUM EXTENT,則表的區(qū)大小將向上舍入為MINIMUM EXTENT值的下一個(gè)較高的倍數(shù)。
外鍵關(guān)聯(lián)的表dept的id列必須是唯一的或者是自身的主鍵,如不是可以用以下語句填加:
alter table dept add constraint dept_id_pk primarykey(id)
塊空間使用參數(shù)可用來控制對數(shù)據(jù)段和索引段空間的使用:
控制并發(fā)性參數(shù):
INITRANS和MAXTRANS指定初始的和最大的事務(wù)位置數(shù),這些事務(wù)位置在索引塊或者數(shù)據(jù)塊內(nèi)創(chuàng)建。事務(wù)位置用來存儲在某一事件點(diǎn)上正在對塊進(jìn)行更改的事務(wù)的信息。一個(gè)事務(wù)只占用一個(gè)事務(wù)位置,即使它正在更改多行或者多個(gè)索引條目。INITRANS對數(shù)據(jù)段的缺省值為1,對索引段的缺省值為2,以保證最低程度的并發(fā)。例如,如果INITRANS設(shè)為3,則保證至少3個(gè)事務(wù)可以同時(shí)對塊進(jìn)行更改。如果需要,也可以從塊空閑空間內(nèi)分配其它事務(wù)位置,以允許更多的事務(wù)并發(fā)修改塊內(nèi)的行。MAXTRANS的缺省值為255,它設(shè)置可更改數(shù)據(jù)塊或者索引塊的并發(fā)事務(wù)數(shù)的限制。設(shè)置后,該值限制事務(wù)位置對空間的使用,從而保證塊內(nèi)有足夠的空間供行或者索引數(shù)據(jù)使用。
控制數(shù)據(jù)空間使用的參數(shù):
數(shù)據(jù)段的PCTFREE指定每個(gè)數(shù)據(jù)塊中保留空間的百分比,用于因更新塊內(nèi)的行而導(dǎo)致的增長。PCTFREE的缺省值為10%。數(shù)據(jù)段的PCTUSED代表Oracle服務(wù)器試圖為表內(nèi)的每個(gè)數(shù)據(jù)塊維持的已用空間的最低百分比。如果一個(gè)塊的已用空間低于PCTUSED,則將這塊放回到空閑列表中。段的空閑列表示容納將來所插入內(nèi)容的可選擇塊的列表。根據(jù)缺省,每個(gè)段在創(chuàng)建時(shí)都有一個(gè)空閑列表。PCTUSED的缺省值為40%。PCTFREE和PCTUSED都按可用數(shù)據(jù)空間百分比來計(jì)算,可用數(shù)據(jù)空間是從整個(gè)塊大小減去塊頭空間后剩余的塊空間。塊空間使用參數(shù)只能針對段指定,而不能在表空間級別設(shè)置。
下面步驟介紹對PCTFREE=20且PCTUSED=40的數(shù)據(jù)段如何管理塊內(nèi)空間:
1.向塊中插入行,直到塊內(nèi)的空閑空間小等于20%。當(dāng)行所占用的塊內(nèi)數(shù)據(jù)空間達(dá)到80%(100-PCTFREE)或者更多后,即無法再向該塊進(jìn)行插入。
2.剩余的20%可在行大小增長時(shí)使用。例如,更新初始為NULL的列并分配一個(gè)值。這樣,由于更新,塊使用率可能超過80%。
3.如果由于更新,刪除了塊內(nèi)的行或者行大小減少,塊使用率可能跌至80%以下。但是,仍然無法向塊中插入,直到塊使用率跌至PCTUSED以下,在本例中PCTUSED為40%。
4.當(dāng)塊使用率跌至PCTUSED以下后,該塊可用于插入。隨著向塊內(nèi)插入行,塊使用率增長,重復(fù)從步驟1開始的循環(huán)。