1. 程式人生 > >SQL 修改表結構

SQL 修改表結構

               

 ***********************************************宣告*********************************************************************** 

原創作品,出自 “深藍的blog” 部落格,歡迎轉載,轉載時請務必註明出處,否則追究版權法律責任。

****************************************************************************************************************************

SQL_修改表結構

說明

實驗環境:利用scott使用者資料,簡單舉例修改表結構範例
SQL> create table emp1 as select * from emp;
Table created
--建立實驗表

1. 表中新增新列

(1)、語法
SQL> alter table 表名 add (列名 資料型別 [,列名 資料型別] ...);

(2)、注意事項
新新增的列會按順序續接原表的列進行排列。

(3)、實驗演示

SQL> alter table emp1 add (evaluatetime DATE);Table altered--新增分析時間列SQL> select * from emp1;--查看錶資料內容
EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO EVALUATETIME----- ---------- --------- ----- ----------- --------- --------- ------ ------------ 7369 SMITH      CLERK      7902 1980/12/17     800.00               20  7499 ALLEN      SALESMAN   7698 1981/2/20     1600.00    300.00     30  7521 WARD       SALESMAN   7698 1981/2/22     1250.00    500.00     30  7566 JONES      MANAGER    7839 1981/4/2      2975.00               20  7654 MARTIN     SALESMAN   7698 1981/9/28     1250.00   1400.00     30  7698 BLAKE      MANAGER    7839 1981/5/1      2850.00               30  7782 CLARK      MANAGER    7839 1981/6/9      2450.00               10  7788 SCOTT      ANALYST    7566 1987/4/19     3000.00               20  7839 KING       PRESIDENT       1981/11/17    5000.00               10  7844 TURNER     SALESMAN   7698 1981/9/8      1500.00      0.00     30  7876 ADAMS      CLERK      7788 1987/5/23     1100.00               20  7900 JAMES      CLERK      7698 1981/12/3      950.00               30  7902 FORD       ANALYST    7566 1981/12/3     3000.00               20  7934 MILLER     CLERK      7782 1982/1/23     1300.00               10 14 rows selectedSQL> desc emp1;--查看錶結構
Name         Type         Nullable Default Comments ------------ ------------ -------- ------- -------- EMPNO        NUMBER(4)    Y                         ENAME        VARCHAR2(10) Y                         JOB          VARCHAR2(9)  Y                         MGR          NUMBER(4)    Y                         HIREDATE     DATE         Y                         SAL          NUMBER(7,2)  Y                         COMM         NUMBER(7,2)  Y                         DEPTNO       NUMBER(2)    Y                         EVALUATETIME DATE         Y   SQL> alter table emp1 add (city varchar2(10) , workscore number(4));Table altered--新增城市列、工作得分列SQL> select * from emp1;--檢視現在資料的內容,內容沒有變化,但看以發現表結構已經發生變化,多了兩個列<span style="font-size:10px;">EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO EVALUATETIME CITY       WORKSCORE----- ---------- --------- ----- ----------- --------- --------- ------ ------------ ---------- --------- 7369 SMITH      CLERK      7902 1980/12/17     800.00               20                          7499 ALLEN      SALESMAN   7698 1981/2/20     1600.00    300.00     30                          7521 WARD       SALESMAN   7698 1981/2/22     1250.00    500.00     30                          7566 JONES      MANAGER    7839 1981/4/2      2975.00               20                          7654 MARTIN     SALESMAN   7698 1981/9/28     1250.00   1400.00     30                          7698 BLAKE      MANAGER    7839 1981/5/1      2850.00               30                          7782 CLARK      MANAGER    7839 1981/6/9      2450.00               10                          7788 SCOTT      ANALYST    7566 1987/4/19     3000.00               20                          7839 KING       PRESIDENT       1981/11/17    5000.00               10                          7844 TURNER     SALESMAN   7698 1981/9/8      1500.00      0.00     30                          7876 ADAMS      CLERK      7788 1987/5/23     1100.00               20                          7900 JAMES      CLERK      7698 1981/12/3      950.00               30                          7902 FORD       ANALYST    7566 1981/12/3     3000.00               20                          7934 MILLER     CLERK      7782 1982/1/23     1300.00               10                         14 rows selected</span>SQL> desc emp1;--查看錶結構Name         Type         Nullable Default Comments ------------ ------------ -------- ------- -------- EMPNO        NUMBER(4)    Y                         ENAME        VARCHAR2(10) Y                         JOB          VARCHAR2(9)  Y                         MGR          NUMBER(4)    Y                         HIREDATE     DATE         Y                         SAL          NUMBER(7,2)  Y                         COMM         NUMBER(7,2)  Y                         DEPTNO       NUMBER(2)    Y                         EVALUATETIME DATE         Y                         CITY         VARCHAR2(10) Y                         WORKSCORE    NUMBER(4)    Y   

2. 修改表中存在的列

(1)、語法
SQL> alter table 表名 modify (列名 資料型別 [,列名 資料型別] ...);

(2)、注意事項
可以增加字元型別的列寬度;
可以增加數字型別的列的寬度、精度;
減少列的寬度,需要該列的值為空;
改變某一列資料型別,需要該列的值為空;
如果改變某列的預設值,只會影響以後的操作。

(3)、實驗演示

SQL> desc emp1;Name         Type         Nullable Default Comments ------------ ------------ -------- ------- -------- EMPNO        NUMBER(4)    Y                         ENAME        VARCHAR2(10) Y                         JOB          VARCHAR2(9)  Y                         MGR          NUMBER(4)    Y                         HIREDATE     DATE         Y                         SAL          NUMBER(7,2)  Y                         COMM         NUMBER(7,2)  Y                         DEPTNO       NUMBER(2)    Y                         EVALUATETIME DATE         Y                         CITY         VARCHAR2(10) Y                         WORKSCORE    NUMBER(4)    Y       SQL> alter table emp1 modify (workscore number(10));--增加列的寬度Table alteredSQL> alter table emp1 modify (workscore varchar2(20));--改變列的資料型別Table alteredSQL> desc emp1;--查詢表結構Name         Type         Nullable Default Comments ------------ ------------ -------- ------- -------- EMPNO        NUMBER(4)    Y                         ENAME        VARCHAR2(10) Y                         JOB          VARCHAR2(9)  Y                         MGR          NUMBER(4)    Y                         HIREDATE     DATE         Y                         SAL          NUMBER(7,2)  Y                         COMM         NUMBER(7,2)  Y                         DEPTNO       NUMBER(2)    Y                         EVALUATETIME DATE         Y                         CITY         VARCHAR2(10) Y                         WORKSCORE    VARCHAR2(20) YSQL> alter table emp1 modify (workscore number(20));--改變列的資料型別Table alteredSQL> alter table emp1 modify (workscore number(4));--減少列的寬度Table alteredSQL> desc emp1;--查詢表結構Name         Type         Nullable Default Comments ------------ ------------ -------- ------- -------- EMPNO        NUMBER(4)    Y                         ENAME        VARCHAR2(10) Y                         JOB          VARCHAR2(9)  Y                         MGR          NUMBER(4)    Y                         HIREDATE     DATE         Y                         SAL          NUMBER(7,2)  Y                         COMM         NUMBER(7,2)  Y                         DEPTNO       NUMBER(2)    Y                         EVALUATETIME DATE         Y                         CITY         VARCHAR2(10) Y                         WORKSCORE    NUMBER(4)    Y       SQL> alter table emp1 modify (job char(9));--將列為varchar2型別變為char型別Table alteredSQL> desc emp1;Name         Type         Nullable Default Comments ------------ ------------ -------- ------- -------- EMPNO        NUMBER(4)    Y                         ENAME        VARCHAR2(10) Y                         JOB          CHAR(9)      Y                         MGR          NUMBER(4)    Y                         HIREDATE     DATE         Y                         SAL          NUMBER(7,2)  Y                         COMM         NUMBER(7,2)  Y                         DEPTNO       NUMBER(2)    Y                         EVALUATETIME DATE         Y                         CITY         VARCHAR2(10) Y                         WORKSCORE    NUMBER(4)    Y                         SQL> alter table emp1 modify (job varchar2(9));--將列有char型別改回varchar2型別Table alteredSQL> alter table emp1 modify (evaluatetime default sysdate);--修改評估時間的預設值為sysdateTable alteredSQL> alter table emp1 modify (hiredate default sysdate);Table altered--修改僱傭時間的預設值為sysdateSQL> select * from emp1;--改變了評估時間的預設值,但該列仍然為空,因為改變只針對修改後的插入的資料EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO EVALUATETIME CITY       WORKSCORE----- ---------- --------- ----- ----------- --------- --------- ------ ------------ ---------- --------- 7369 SMITH      CLERK      7902 1980/12/17     800.00               20                          7499 ALLEN      SALESMAN   7698 1981/2/20     1600.00    300.00     30                          7521 WARD       SALESMAN   7698 1981/2/22     1250.00    500.00     30                          7566 JONES      MANAGER    7839 1981/4/2      2975.00               20                          7654 MARTIN     SALESMAN   7698 1981/9/28     1250.00   1400.00     30                          7698 BLAKE      MANAGER    7839 1981/5/1      2850.00               30                          7782 CLARK      MANAGER    7839 1981/6/9      2450.00               10                          7788 SCOTT      ANALYST    7566 1987/4/19     3000.00               20                          7839 KING       PRESIDENT       1981/11/17    5000.00               10                          7844 TURNER     SALESMAN   7698 1981/9/8      1500.00      0.00     30                          7876 ADAMS      SALESMAN   7788 1987/5/23     1100.00               20                          7900 JAMES      CLERK      7698 1981/12/3      950.00               30                          7902 FORD       ANALYST    7566 1981/12/3     3000.00               20                          7934 MILLER     CLERK      7782 1982/1/23     1300.00               10                         14 rows selectedSQL> insert into emp1(empno,ename,job,mgr,hiredate,sal,comm,deptno,evaluatetime,city,workscore) values (8000,'HYL','DBA','7839','','5000','','10',default,'beijing','90');--插入一條實驗資料1 row insertedSQL> insert into emp1 (empno,ename,job,evaluatetime) values (8001,'HF','DBA',default);1 row inserted--再插入一條實驗資料SQL> select * from emp1;--可以發現實驗資料中的結果,兩條預設值更改為sysdate的資料,在新插入資料時相應的列已經變為了系統時間EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO EVALUATETIME CITY       WORKSCORE----- ---------- --------- ----- ----------- --------- --------- ------ ------------ ---------- --------- 7369 SMITH      CLERK      7902 1980/12/17     800.00               20                          7499 ALLEN      SALESMAN   7698 1981/2/20     1600.00    300.00     30                          7521 WARD       SALESMAN   7698 1981/2/22     1250.00    500.00     30                          7566 JONES      MANAGER    7839 1981/4/2      2975.00               20                          7654 MARTIN     SALESMAN   7698 1981/9/28     1250.00   1400.00     30                          7698 BLAKE      MANAGER    7839 1981/5/1      2850.00               30                          7782 CLARK      MANAGER    7839 1981/6/9      2450.00               10                          7788 SCOTT      ANALYST    7566 1987/4/19     3000.00               20                          7839 KING       PRESIDENT       1981/11/17    5000.00               10                          7844 TURNER     SALESMAN   7698 1981/9/8      1500.00      0.00     30                          7876 ADAMS      SALESMAN   7788 1987/5/23     1100.00               20                          7900 JAMES      CLERK      7698 1981/12/3      950.00               30                          7902 FORD       ANALYST    7566 1981/12/3     3000.00               20                          7934 MILLER     CLERK      7782 1982/1/23     1300.00               10                          8000 HYL        DBA        7839               5000.00               10 2014/10/3 19 beijing           90 8001 HF         DBA             2014/10/3 1                            2014/10/3 19            16 rows selected

3. 表中刪除一個列

(1)、語法
SQL> alter table 表名 drop column 列名;

(2)、注意事項
一次只能刪除一列;
所刪除的列不是表中的唯一列;
刪除列將無法回滾,所以刪除前請確認無誤再進行操作。

(3)、實驗演示

SQL> select * from emp1;--查詢表中的資料,計劃將列EVALUATETIME、CITY、WORKSCORE刪除掉EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO EVALUATETIME CITY       WORKSCORE----- ---------- --------- ----- ----------- --------- --------- ------ ------------ ---------- --------- 7369 SMITH      CLERK      7902 1980/12/17     800.00               20                          7499 ALLEN      SALESMAN   7698 1981/2/20     1600.00    300.00     30                          7521 WARD       SALESMAN   7698 1981/2/22     1250.00    500.00     30                          7566 JONES      MANAGER    7839 1981/4/2      2975.00               20                          7654 MARTIN     SALESMAN   7698 1981/9/28     1250.00   1400.00     30                          7698 BLAKE      MANAGER    7839 1981/5/1      2850.00               30                          7782 CLARK      MANAGER    7839 1981/6/9      2450.00               10                          7788 SCOTT      ANALYST    7566 1987/4/19     3000.00               20                          7839 KING       PRESIDENT       1981/11/17    5000.00               10                          7844 TURNER     SALESMAN   7698 1981/9/8      1500.00      0.00     30                          7876 ADAMS      SALESMAN   7788 1987/5/23     1100.00               20                          7900 JAMES      CLERK      7698 1981/12/3      950.00               30                          7902 FORD       ANALYST    7566 1981/12/3     3000.00               20                          7934 MILLER     CLERK      7782 1982/1/23     1300.00               10                          8000 HYL        DBA        7839               5000.00               10 2014/10/3 19 beijing           90 8001 HF         DBA             2014/10/3 1                            2014/10/3 19            16 rows selectedSQL> alter table emp1 drop column EVALUATETIME,CITY;--嘗試一次刪除兩個列,報錯了alter table emp1 drop column EVALUATETIME,CITYORA-00933: SQL command not properly endedSQL> alter table emp1 drop column EVALUATETIME;--刪除EVALUATETIME列Table alteredSQL> alter table emp1 drop column CITY;--刪除CITY列Table alteredSQL> alter table emp1 drop column WORKSCORE;--刪除WORKSCORE列Table alteredSQL> select * from emp1;--再次查詢,刪除的三個列已經被成功刪除了EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO----- ---------- --------- ----- ----------- --------- --------- ------ 7369 SMITH      CLERK      7902 1980/12/17     800.00               20 7499 ALLEN      SALESMAN   7698 1981/2/20     1600.00    300.00     30 7521 WARD       SALESMAN   7698 1981/2/22     1250.00    500.00     30 7566 JONES      MANAGER    7839 1981/4/2      2975.00               20 7654 MARTIN     SALESMAN   7698 1981/9/28     1250.00   1400.00     30 7698 BLAKE      MANAGER    7839 1981/5/1      2850.00               30 7782 CLARK      MANAGER    7839 1981/6/9      2450.00               10 7788 SCOTT      ANALYST    7566 1987/4/19     3000.00               20 7839 KING       PRESIDENT       1981/11/17    5000.00               10 7844 TURNER     SALESMAN   7698 1981/9/8      1500.00      0.00     30 7876 ADAMS      SALESMAN   7788 1987/5/23     1100.00               20 7900 JAMES      CLERK      7698 1981/12/3      950.00               30 7902 FORD       ANALYST    7566 1981/12/3     3000.00               20 7934 MILLER     CLERK      7782 1982/1/23     1300.00               10 8000 HYL        DBA        7839               5000.00               10 8001 HF         DBA             2014/10/3 1                     16 rows selected

4. 把表的列設定成無用(UNUSED)

(1)、語法
SQL> alter table 表名 set unused(列名);

SQL> alter table 表名 set unused column 列名;

SQL> drop table 表名 drop unused columns;

(2)、注意事項
    把表的列設定成unused是為了解決在業務高峰期的刪除操作任務。因為在業務高峰期對資料量較大的某列執行刪除操作的話,將影響系統的執行效率。此時我們就可以使用設定unused的方法臨時性迂迴的完成刪除任務。待過了高峰期後,再手工使用drop命令刪除原計劃刪除的列。因為設定unused只是做了一個刪除的標記,實際的資料依然存在在資料庫中,但是這樣的資料是查詢不到的,因此之後還需要手工刪除。

(3)、實驗演示

SQL> select * from emp1;--先來看看錶中的資料內容EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO----- ---------- --------- ----- ----------- --------- --------- ------ 7369 SMITH      CLERK      7902 1980/12/17     800.00               20 7499 ALLEN      SALESMAN   7698 1981/2/20     1600.00    300.00     30 7521 WARD       SALESMAN   7698 1981/2/22     1250.00    500.00     30 7566 JONES      MANAGER    7839 1981/4/2      2975.00               20 7654 MARTIN     SALESMAN   7698 1981/9/28     1250.00   1400.00     30 7698 BLAKE      MANAGER    7839 1981/5/1      2850.00               30 7782 CLARK      MANAGER    7839 1981/6/9      2450.00               10 7788 SCOTT      ANALYST    7566 1987/4/19     3000.00               20 7839 KING       PRESIDENT       1981/11/17    5000.00               10 7844 TURNER     SALESMAN   7698 1981/9/8      1500.00      0.00     30 7876 ADAMS      SALESMAN   7788 1987/5/23     1100.00               20 7900 JAMES      CLERK      7698 1981/12/3      950.00               30 7902 FORD       ANALYST    7566 1981/12/3     3000.00               20 7934 MILLER     CLERK      7782 1982/1/23     1300.00               10 8000 HYL        DBA        7839               5000.00               10 8001 HF         DBA             2014/10/3 1                     16 rows selectedSQL> alter table emp1 set unused (comm,sal);--將表中要刪除的兩列設定為unusedTable alteredSQL> select * from emp1;--刪除兩個列後,查詢表的資料,你會發現這兩個已經無法檢視到EMPNO ENAME      JOB         MGR HIREDATE    DEPTNO----- ---------- --------- ----- ----------- ------ 7369 SMITH      CLERK      7902 1980/12/17      20 7499 ALLEN      SALESMAN   7698 1981/2/20       30 7521 WARD       SALESMAN   7698 1981/2/22       30 7566 JONES      MANAGER    7839 1981/4/2        20 7654 MARTIN     SALESMAN   7698 1981/9/28       30 7698 BLAKE      MANAGER    7839 1981/5/1        30 7782 CLARK      MANAGER    7839 1981/6/9        10 7788 SCOTT      ANALYST    7566 1987/4/19       20 7839 KING       PRESIDENT       1981/11/17      10 7844 TURNER     SALESMAN   7698 1981/9/8        30 7876 ADAMS      SALESMAN   7788 1987/5/23       20 7900 JAMES      CLERK      7698 1981/12/3       30 7902 FORD       ANALYST    7566 1981/12/3       20 7934 MILLER     CLERK      7782 1982/1/23       10 8000 HYL        DBA        7839                 10 8001 HF         DBA             2014/10/3 1 16 rows selectedSQL> desc emp1;--即使查看錶結構,也不會發現被設定為unused的兩個列,因為目前對於資料庫而言,這兩個列已經是刪除的列了Name     Type         Nullable Default Comments -------- ------------ -------- ------- -------- EMPNO    NUMBER(4)    Y                         ENAME    VARCHAR2(10) Y                         JOB      CHAR(9)      Y                         MGR      NUMBER(4)    Y                         HIREDATE DATE         Y        sysdate          DEPTNO   NUMBER(2)    Y     SQL> alter table emp1 drop unused columns;--之後手工刪除掉emp1表中標記為unused的列的資料Table altered

***********************************************宣告*********************************************************************** 

原創作品,出自 “深藍的blog” 部落格,歡迎轉載,轉載時請務必註明出處,否則追究版權法律責任。

****************************************************************************************************************************

系列連結_20150523: