1.4.2 如何修改表的结构
表在创建以后,如果在使用的过程中发现表的结构不合理,可以通过执行ALTER命令修改它的结构。修改表结构的操作包括增加列、修改某个列的定义、删除列、增加约束、修改约束、表的重命名等。
ALTER命令可以使用若干个子句,通过这些子句可以完成修改表结构的操作。可以使用的子句包括ADD、DROP、MODIFY和RENAME等。
如果要在表中增加一个列,通过ADD子句指定一个列的定义,至少要包括列名和列的数据类型。增加列的语法结构为:
ALTER TABLE表名
ADD(列1,数据类型,
列2,数据类型,
……);
例如,要在student表中增加两个列,一个是性别,另一个是家庭地址,对应的ALTER语句为:
SQL>ALTER TABLE student
ADD(gender char(2)DEFAULT'男',
address varchar2(50));
需要注意的是,如果一个表中已经有数据,这时增加一个列时,不能将该列约束为“非空(NOT NULL)”,因为我们不能一方面要求该列必须有数据,而另一方面又无法在增加列的同时向该列插入数据。例如,要向dept表中增加一个非空的列,语句的执行将出错:
ALTER TABLE dept
ADD(alias char(20)NOT NULL)
这条语句执行的结果为:
ALTER TABLE dept
*
ERROR位于第1行:
ORA-01758:要添加法定(NOT NULL)列,则表必须为空
也就是说,要往一个表中增加一个非空列时,这个表必须是空的。如果表中已经有数据,单独使用“NOT NULL”约束是不行的。一种好的解决办法是为该列指定默认值,这样在增加一个非空列的同时,为这个列填充了指定的默认值。
例如,上面的ALTER语句如果修改为下面的形式,就可以保证这个列能够顺利加入到表中:
ALTER TABLE dept
ADD(alias char(20)default'NOT KNOWN'NOT NULL);
利用ALTER语句还可以从表中删除一个列。用来完成这个操作的子句是DROP。用于删除列的ALTER语句格式为:
ALTER TABLE表名DROP COLUMN列名
例如,要删除表student中的gender列,对应的ALTER语句为:
ALTER TABLE student DROP COLUMN gender;
删除一个列时,这个列将从表的结构中消失,这个列的所有数据也将从表中被删除。原则上可以删除任何列,但是一个列如果作为表的主键,而且另一个表已经通过外键在两个表之间建立了关联关系,这样的列是不能被删除的。例如,如果要删除表dept中的列deptno,系统将会发生错误:
ALTER TABLE dept DROP COLUMN deptno
*
ERROR位于第1行:
ORA-12992:无法删除父项关键字列
如果要修改表中一个列的定义,可以使用ALTER语句的MODIFY子句。通过MODIFY子句可以修改列的长度、非空等属性。使用了MODIFY子句的ALTER语句格式为:
ALTER TABLE表名
MODIFY(列1,新数据类型非空属性,
列2,新数据类型非空属性,
……);
例如,要将表student中的gender列由原来的char(2)改为char(4),非空,将address列由原来的varchar2(50)改为char(40),相应的ALTER语句为:
SQL>ALTER TABLE student
MODIFY(gender char(4)NOT NULL,
address char(40));
需要注意的是,如果表中目前没有数据,那么可以将一个列的长度增加或减小,也可以将一个列指定为非空。如果表中已经有数据,那么只能增加列的长度,如果该列有空值,不能将该列指定为非空。
通过ALTER语句,还可以为表进行重命名,也就是将表的名字改为另一个名字。为表重命名的ALTER语句格式为:
ALTER TABLE表名RENAME TO新表名
例如,要将表student重命名为stu,相应的ALTER语句为:
SQL>ALTER TABLE student RENAME TO stu;