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

