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

4.8 維護列

在實際的項目開發過程中,需要對建好的表進行修改,如增加或刪除列、修改列名等,這樣的操作如果通過重新建表顯然是不現實的,本節將講解如何在已經建好的表中完成列維護。我們在4.2節已經建立了一個表EMPLOYEES。因為該表沒有數據,我們先向該表中插入數據,如例子4-16所示。

例子4-16 向表employees中插入數據

    SQL> insert into scott.employees
      2  values(1,'Tom','address1','80854340');
    
    已創建 1 行。

再使用例子4-17查詢該表中的所有數據。

例子4-17 查詢表employees中的所有數據

    SQL> select *
      2  from scott.employees;
    
    ECODE ENAME                     EADDRESS                       EPHONE
    ---------- -------------------------------------------- ----------------------------------------------- -----------
          1 Tom                       address1                       80854340

該表有4列,分別為ECODE、ENAME、EADDRESS和EPHONE,該表中只有一行記錄,員工名字是Tom。

1.插入一列

下面我們演示如何插入一列,在表EMPLOYEES中沒有員工性別,這顯然是不合適的。我們在表中增加一列SEX,如例子4-18所示。

例子4-18 向表employees中增加一列SEX

    SQL>ALTER TABLE scott.employees
      2   add (
      3       sex    char
      4       );
    表已更改。

為了驗證是否增加了一列,使用例子4-19繼續查詢該表中的所有數據。

例子4-19 驗證例子4-18是否向表employees中增加了一列

    SQL> col ename for a10
    SQL> col eaddress for a20
    SQL> col sex for a10
    SQL> select *
      2* from scott.employees
    
    ECODE ENAME      EADDRESS             EPHONE          SEX
    ---------- -------------------- ---------------------------------- ------------------------- ----------
         1 Tom      address1             80854340

從輸出結果看出,我們已經成功添加了一列,該列名為SEX,但是值為空。

下面我們再增加一列,并且對該列做修改,列名為DEGREE,如例子4-20所示。

例子4-20 向表employees中增加一列

    SQL> ALTER TABLE scott.employees
      2  add (
      3       degree varchar2(10)
      4       );
    
    表已更改。

此時,更新表中的數據使得員工Tom的SEX列和DEGREE列都有數據,如例子4-21所示。

例子4-21 更新員工Tom的SEX列和DEGREE列的值

    SQL> update scott.employees
      2    set sex ='m',degree='Bachelor'
      3  where ename = 'Tom';
    
    已更新 1 行。

查詢該結果,如例子4-22所示。

例子4-22 查詢例子4-21的修改結果

    SQL> col sex for a3
    SQL> col eaddress for a10
    SQL> select *
      2* from scott.employees
    
    ECODE ENAME      EADDRESS   EPHONE              SEX    DEGREE
    ---------- -------------------- ----------------- --------------------------- ------ --------------
         1 Tom           address1      80854340        m   Bachelor

輸出顯示我們成功在新添加的列中增加了數據。但是如果需要修改一個列的約束,比如不允許該列為空(NULL),則需要修改列。

2.修改列

把列DEGREE設置為不允許為空(NULL),如例子4-23所示。

例子4-23 將表employees中的列DEGREE設置為不允許為空

    SQL> ALTER TABLE scott.employees
      2  modify(
      3  degree varchar2(10) not null
      4        )
      5  ;
    
    表已更改。
    SQL> desc scott.employees;
     名稱                                      是否為空? 類型
     ----------------------------------------- -------- ---------------
     ECODE                                              NUMBER(4)
     ENAME                                              VARCHAR2(25)
     EADDRESS                                           VARCHAR2(30)
     EPHONE                                             VARCHAR2(15)
     SEX                                                CHAR(1)
     DEGREE                                    NOT NULL VARCHAR2(10)

我們成功修改了列DEGREE的約束,不允許該列為空,用戶再次插入數據時,如果該列為空則無法成功插入。

3.刪除列

用戶既然可以修改表中的列和添加列。自然也可以刪除不需要的列。刪除列的語法格式為:

    ALTER TABLE tablename DROP COLUMN columnname CASCATE CONTRAINTS

參數CASCADE CONSTRAINTS不是必需的,但是如果該列是一個表的外鍵,也就是說該表是一個外鍵引用的父表,而該外健就是此時要刪除的列,則需要使用CASCADE CONSTRAINTS參數。

該操作對于Oracle8i以上的版本都適用,但是使用該指令時,數據庫系統會重新將表寫入磁盤,目的是為了還原需要,這樣對于一個大表就會占用較大的還原空間,一旦刪除該列將導致無法恢復。

例子4-24 刪除表EMPLOYEES中的列DEGREE

    SQL> ALTER TABLE scott.employees DROP COLUMN degree;
    
    表已更改。
    SQL> desc scott.employees;
     名稱                                      是否為空? 類型
     ----------------------------------------- -------- -------------
     ECODE                                              NUMBER(4)
     ENAME                                              VARCHAR2(25)
     EADDRESS                                           VARCHAR2(30)
     EPHONE                                             VARCHAR2(15)
     SEX                                                CHAR(1)

上例輸出說明,已成功刪除表EMPLOYEES中的列DEGREE。

在大表中刪除一行非常耗費時間,此時可以在ALTER TABLE語句中使用SET UNUSED子句,這樣就將表中某列置成無用的列。其語法如下:

    ALTER TABLE <username.>tablename
    SET UNUSED COLUMN columnname CASCADE CONSTRAINTS;

其實,此時并沒有刪除該表中該列的數據,而是使得用戶查詢時看不到該列內容,該列被數據庫認為是刪除的列。并且一旦該列設置為UNUSED則無法恢復。但數據庫空閑時,可以使用如下命令再刪除置為無用的列。

    ALTER TABLE <username.>tablename
    DROP UNUSED COLUMNS ;

下面演示如何將一列設置成無用的列。如例子4-25所示,將EPHONE列設置為無用的列。

例子4-25 將表employees中的EPHONE列設置為無用的列

    SQL> ALTER TABLE scott.employees
      2* SET UNUSED  COLUMN ephone
    
    表已更改。
    SQL> select *
      2  from scott.employees;
    
    ECODE ENAME      EADDRESS   SEX
    ---------- ------------------- ------------------- ---
         1 Tom           address1      m

表EMPLOYEES中的列EPHONE設置為無用,此時數據庫認為該列已經刪除,在使用SQL語句查詢時會發現沒有列EPHONE的值。

下面刪除掉設置為UNUSED的列。

例子4-26 刪除掉表employees中設置為UNUSED的列

    SQL> alter table scott.employees
      2  drop unused columns;
    
    表已更改。

4.更改列名字

列名是程序員設計的用來表示一個字段的信息,如果在開發過程中由于某種原因需要對列名進行規范,則需要對已經創建好的表的列名進行修改。修改列名的語句很簡單,如下所示。

    ALTER TABLE <username.>employees
    RENAME COLUMN old_columnname
    TO new_columnname;

例子4-27給出修改列名的實例演示,該實例將表EMPLOYEES中的列SEX 改為E_SEX。

例子4-27 將表EMPLOYEES中的列SEX 改為E_SEX

    SQL> alter table scott.emp
      2  rename column sal
      3  to salary;
    
    表已更改。

查詢更改結果,如下所示。

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

從上述輸出中可以看到原表中的SAL列名已經改為SALARY了。

主站蜘蛛池模板: 石景山区| 衢州市| 瑞昌市| 荔浦县| 石景山区| 隆子县| 巴彦县| 岳池县| 东源县| 沂水县| 包头市| 卢龙县| 德阳市| 紫阳县| 全椒县| 阳城县| 高淳县| 新宁县| 克东县| 东乌珠穆沁旗| 连城县| 武冈市| 车险| 霍州市| 西乌珠穆沁旗| 邵阳市| 游戏| 汉川市| 丁青县| 旬阳县| 庐江县| 锦屏县| 平遥县| 柳江县| 吉首市| 贵南县| 延边| 会东县| 丹巴县| 拉萨市| 沙河市|