- Oracle DBA基礎教程
- 林樹澤
- 1606字
- 2021-03-26 13:21:43
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了。
- JBoss Weld CDI for Java Platform
- C程序設計簡明教程(第二版)
- 數據結構習題精解(C語言實現+微課視頻)
- iOS應用逆向工程(第2版)
- Android Native Development Kit Cookbook
- 零基礎入門學習Python
- Java系統化項目開發教程
- 51單片機C語言開發教程
- Test-Driven Development with Django
- INSTANT Silverlight 5 Animation
- JBoss:Developer's Guide
- 單片機原理及應用技術
- 你好!Java
- Building Clouds with Windows Azure Pack
- Visual C++ 開發從入門到精通