官术网_书友最值得收藏!

4.9 刪除和截斷表

在不需要一個表時,可以刪除表,使用DROP TABLE語句,此時會徹底刪除表中的數據和表的結構,表的結構指在創建表時定義的列名、列屬性和一些約束信息。

如果只想刪除表中的數據可以使用TRUNCATE TABLE語句截斷一個表,此時會保留表的結構,只刪除表中的數據。本節將講解和演示如何刪除和截斷表。

為了演示如何刪除或截斷一個表,先使用例子4-28創建一個表EMP_TEMP。

例子4-28 創建一個表EMP_TEMP

    SQL> create TABLE scott.emp_temp
     2  as
     3  select *
     4  from scott.emp;
     
    表已創建。

不嚴謹地講,表由表結構和表中的數據組成,如果不需要表中的數據,可以使用TRUNCATE來截斷一個表。使用該指令截斷表時,只刪除表中的數據但是保留表的結構,也就是對表的定義還是存在的,可以使用INSERT指令向表中添加數據。

該指令的語法格式為:

    TRUNCATE TABLE username.TABLEname。

為了使讀者便于直觀理解,這里先給出一個例子(如例子4-29所示),然后再介紹TRUNCATE的其他特性。

例子4-29 截斷表emp_temp

    SQL> truncate TABLE scott.emp_temp;
    
    表已截掉。

輸出說明用戶SCOTT中的表emp_temp已經截斷,再使用例子4-30驗證改變表的結構,也就是驗證對表的定義是否還存在。

例子4-30 驗證表emp_temp的定義是否還存在

    SQL> desc scott.emp_temp;
     名稱                                                  是否為空? 類型
     ---------------------------------------------------------------------------------- ------------ -------------
     EMPNO                                                          NUMBER(4)
     ENAME                                                          VARCHAR2(10)
     JOB                                                             VARCHAR2(9)
     MGR                                                            NUMBER(4)
     HIREDATE                                                       DATE
     SAL                                                             NUMBER(7,2)
     COMM                                                           NUMBER(7,2)
     DEPTNO                                                         NUMBER(2)

顯然,輸出結果說明用戶SCOTT的表emp_temp依然存在。再使用例子4-31來驗證表中是否還有數據。

例子4-31 驗證表emp_temp中是否還有數據

    SQL> select *
      2  from scott.emp_temp;
    
    未選定行

顯然,用戶SCOTT的表emp_temp中沒有數據。

下面我們總結一下TRUNCATE指令的特性,這些特性來源于Oracle的文檔。

● 刪除表中的數據但是保留了表結構。

● 數據一旦刪除就釋放數據占有的磁盤空間,并且數據不可恢復。

● 如果表被外鍵引用,則無法使用TRUNCATE刪除表中的數據。

● 所有和表相關的索引也被截斷。

● 不會觸發刪除表的刪除觸發器。

在讀者學習了索引和觸發器后可以使用例子來驗證上述對于TRUNCATE指令特性的說明是否正確。這里不再給出具體示例。

如果不再需要表,包括表中的數據和表的結構,則使用DROP指令。使用該指令時刪除的是表的結構,表中的數據無法恢復,所以在使用該指令前務必要確認不再需要該表。使用DROP刪除表的語法格式為:

    DROP TABLE [username.]TABLEname
    CASCADE CONSTRAINTS;

當一個表被DROP后,該表使用的EXTENTS得到釋放,如果這些EXTENTS是連續分配的,則這些連續區域得到釋放并組合成更大的可分配空間。如果該表的外鍵被另一個表引用,即該表在外鍵關系中是父表,則需要使用CASCADE CONSTRAINTS。使得該表脫離與子表的關系,并順利刪除。在維護數據完整性時會再次講到CASCADE CONSTRAINTS,讀者可以暫時不關心該參數的使用。

為了說明刪除一個表,我們使用例子4-32來說明,在使用TRUNCATE刪除用戶SCOTT的表emp_temp時,正是刪除了表中的數據,下面就使用DROP指令刪除表結構。

例子4-32 使用DROP指令刪除表emp_temp

    SQL> DROP TABLE scott.emp_temp;
    
    表已丟棄。

再使用例子4-33,驗證該表的結構和表中數據是否存在。

例子4-33 驗證SCOTT用戶的表emp_temp結構是否存在

    SQL> desc scott.emp_temp;
    ERROR:
    ORA-04043: 對象 scott.emp_temp 不存在

顯然在用戶SCOTT的表emp_temp已經刪除,因為錯誤提示為“對象 scott.emp_temp 不存在”。當然也無法查詢該表中的數據。

主站蜘蛛池模板: 景德镇市| 清河县| 澄城县| 元阳县| 和平县| 盱眙县| 竹北市| 湘阴县| 台南市| 凉山| 阿鲁科尔沁旗| 顺义区| 色达县| 东台市| 文水县| 东丰县| 丰顺县| 喜德县| 岳阳市| 木兰县| 积石山| 宁远县| 右玉县| 定结县| 凌源市| 阿克陶县| 磐石市| 青州市| 思茅市| 兴安盟| 建瓯市| 汕头市| 娄底市| 嘉鱼县| 水富县| 精河县| 乌什县| 太白县| 太康县| 保康县| 五指山市|