zoukankan      html  css  js  c++  java
  • SQL_修改表结构

     ***********************************************声明*********************************************************************** 

    原创作品,出自 “深蓝的blog” 博客,欢迎转载,转载时请务必注明出处,否则追究版权法律责任。

    深蓝的blog:http://blog.csdn.net/huangyanlong/article/details/39758393

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

    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 selected
    
    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  
     
    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 altered
    SQL> alter table emp1 modify (workscore varchar2(20));
    --改变列的数据类型
    Table altered
    
    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    VARCHAR2(20) Y
    
    SQL> alter table emp1 modify (workscore number(20));
    --改变列的数据类型
    Table altered
    
    SQL> alter table emp1 modify (workscore number(4));
    --降低列的宽度
    Table altered
    
    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 (job char(9));
    --将列为varchar2类型变为char类型
    Table altered
    
    SQL> 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 altered
    
    SQL> alter table emp1 modify (evaluatetime default sysdate);
    --改动评估时间的默认值为sysdate
    Table altered
    
    SQL> alter table emp1 modify (hiredate default sysdate);
    Table altered
    --改动雇佣时间的默认值为sysdate
    
    SQL> 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 selected
    
    SQL> 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 inserted
    SQL> 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 selected
    SQL> alter table emp1 drop column EVALUATETIME,CITY;
    --尝试一次删除两个列,报错了
    alter table emp1 drop column EVALUATETIME,CITY
    ORA-00933: SQL command not properly ended
    
    SQL> alter table emp1 drop column EVALUATETIME;
    --删除EVALUATETIME列
    Table altered
    
    SQL> alter table emp1 drop column CITY;
    --删除CITY列
    Table altered
    
    SQL> alter table emp1 drop column WORKSCORE;
    --删除WORKSCORE列
    Table altered
    
    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 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 selected
    
    SQL> alter table emp1 set unused (comm,sal);
    --将表中要删除的两列设置为unused
    Table altered
    
    SQL> 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 selected
    
    SQL> 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” 博客。欢迎转载。转载时请务必注明出处,否则追究版权法律责任。

    深蓝的blog:http://blog.csdn.net/huangyanlong/article/details/39758393

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

    系列链接_20150523:

    蓝的成长记——追逐DBA(1):奔波于路上,挺进山东 

    蓝的成长记——追逐DBA(2):安装!安装!久违的记忆,引起我对DBA的又一次认知

    蓝的成长记——追逐DBA(3):古董上操作,数据导入导出成了问题 

    蓝的成长记——追逐DBA(4):追忆少年情愁。再探oracle安装(Linux下10g、11g) 

    蓝的成长记——追逐DBA(5):不谈技术谈业务,恼人的应用系统

    蓝的成长记——追逐DBA(6): 做事与做人:小技术。大为人

    蓝的成长记——追逐DBA(7):基础命令,地基之石 

    蓝的成长记——追逐DBA(8):重拾SP报告。回顾oracle的STATSPACK实验

    蓝的成长记— —追逐DBA(9):国庆渐去,追逐DBA,新规划,新启程

    蓝的成长记——追逐DBA(10):飞刀防身。熟络而非专长:摆弄中间件Websphere 

    蓝的成长记——追逐DBA(11):回家后的安逸,晕晕乎乎醒了过来 

    蓝的成长记——追逐DBA(12):七天七收获的SQL

    蓝的成长记——追逐DBA(13):协调硬件厂商。六个故事:所见所感的“server、存储、交换机......”

    蓝的成长记——追逐DBA(14):难忘的“云”端,起步的hadoop部署 

    蓝的成长记——追逐DBA(15):以为FTP非常“简单”,谁成想一波三折

    蓝的成长记——追逐DBA(16):DBA也喝酒,被捭阖了

     

    版权声明:本文博客原创文章。博客,未经同意,不得转载。

  • 相关阅读:
    SpringBoot2.1.6 整合CXF 实现Webservice
    一次线上CPU高的问题排查实践
    SpringBoot整合升级Spring Security 报错 【The request was rejected because the URL was not normalized】
    Web服务器☞Apache VS Nginx
    PHP 遍历一个文件夹下所有文件和子文件夹的方法
    PHP 使用 header 方式实现文件下载功能
    PHP gd 库添加 freetype
    MySQL varchar 最大长度,text 类型占用空间剖析
    S.O.L.I.D: PHP 面向对象设计的五个基准原则
    PHP不重新编译,单独添加模块扩展的方法
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4738581.html
Copyright © 2011-2022 走看看