Oracle數據庫數據對象中最基本的是表和視圖,其他還有約束、序列、函數、存儲過程、包、觸發器等。對數據庫的操作可以基本歸結為對數據對象的操作,理解和掌握Oracle數據庫對象是學習Oracle的捷徑。
表和視圖
Oracle中表是數據存儲的基本結構。ORACLE8引入了分區表和對象表,Oracle8i引入了臨時表,使表的功能更強大。視圖是一個或多個表中數據的邏輯表達式。本文我們將討論怎樣創建和管理簡單的表和視圖。
管理表
表可以看作有行和列的電子數據表,表是關系數據庫中一種擁有數據的結構。用CREATE TABLE語句建立表,在建立表的同時,必須定義表名,列,以及列的數據類型和大小。例如:
CREATE TABLE products
( PROD_ID NUMBER(4),
PROD_NAME VAECHAR2(20),
STOCK_QTY NUMBER(5,3)
);
這樣我們就建立了一個名為products的表, 關鍵詞CREATE TABLE後緊跟的表名,然後定義了三列,同時規定了列的數據類型和大小。
在創建表的同時你可以規定表的完整性約束,也可以規定列的完整性約束,在列上普通的約束是NOT NULL,關於約束的討論我們在以後進行。
在建立或更改表時,可以給表一個缺省值。缺省值是在增加行時,增加的數據行中某一項值為null時,Oracle即認為該值為缺省值。
下列數據字典視圖提供表和表的列的信息:
. DBA_TABLES
. DBA_ALL_TABLES
. USER_TABLES
. USER_ALL_TABLES
. ALL_TABLES
. ALL_ALL_TABLES
. DBA_TAB_COLUMNS
. USER_TAB_COLUMNS
. ALL_TAB_COLUMNS
表的命名規則
表名標識一個表,所以應盡可能在表名中描述表,
Oracle中表名或列名最長可以達30個字符串。表名應該以字母開始,可以在表名中包含數字、下劃線、#、$等。
從其它表中建立表 可以使用查詢從基於一個或多個表中建立表,表的列的數據類型和大小有查詢結果決定。建立這種形式的表的查詢可以選擇其他表中所有的列或者只選擇部分列。在CREATE TABLE語句中使用關鍵字AS,例如:
SQL>CREATE TABLE emp AS SELECT * FROM employee
TABLE CREATED
SQL> CREATE TABLE Y AS SELECT * FROM X WHERE no=2
需要注意的是如果查詢涉及LONG數據類型,那麼CREATE TABLE....AS SELECT....將不會工作。
更改表定義 在建立表後,有時候我們可能需要修改表,比如更改列的定義,更改缺省值,增加新列,刪除列等等。Oracle使用ALTER TABLE語句來更改表的定義
1、增加列
語法:
ALTER TABLE [schema.] table_name ADD column_definition
例:
ALTER TABLE orders ADD order_date DATE;
TABLE ALTER
對於已經存在的數據行,新列的值將是NULL.
2、更改列
語法:
ALTER TABLE [schema.] table_name MODIFY column_name new_attributes;
例:
ALTER TABLE orders MODITY (quantity number(10,3),status varchar2(15));
這個例子中我們修改了表orders,將STATUS列的長度增加到15,將QUANTITY列減小到10,3;
修改列的規則如下:
. 可以增加字符串數據類型的列的長度,數字數據類型列的精度。
. 減少列的長度時,該列應該不包含任何值,所有數據行都為NULL.
. 改變數據類型時,該列的值必須是NULL.
. 對於十進制數字,可以增加或減少但不能降低他的精度。
3、刪除數據列
優化Oracle數據庫,唯一的方法是刪除列,重新建立數據庫。在Oracle8i中有很多方法刪除列,你可以刪除未用數據列或者可以標示該列為未用數據列然後刪除。
刪除數據列的語法是:
ALTER TABLE [schema.] table_name DROP {COLUM column_names | (column_names)}[CASCADE CONSTRAINS]
要注意的是在刪除列時關於該列的索引和完整性約束也同時刪除。注意關鍵字CASCADE CONSTRAINS,如果刪除的列是多列約束的一部分,那麼這個約束條件相對於其他列也同時刪除。
如果用戶擔心在大型數據庫中刪除列要花太多時間,可以先將他們標記為未用數據列,標記未用數據列的語法如下:
ALTER TABLE [schema.] table_name SET UNUSED {COLUM column_names | (column_names)}[CASCADE CONSTRAINS]
這個語句將一個或多個數據列標記為未用數據列,但並不刪除數據列中的數據,也不釋放占用的磁盤空間。但是,未用數據列在視圖和數據字典中並不顯示,並且該數據列的名稱將被刪除,新的數據列可以使用這個名稱。基於該數據列的索引、約束,統計等都將被刪除。
刪除未用數據列的語句是:
ALTER TABLE [schema.] table_name DROP {UNUSED COLUM | COLUMN CONTINUE}