第二种方法:通过新建表,在新表上更改字段,最后rename新表来完成
22:41:44 SQL> create table t1 as select * from t where 1=2;
表已创建。
22:42:14 SQL> alter table t1 modify (a number);
表已更改。
22:42:24 SQL> insert into t1 select * from t;
已创建 1 行。
22:42:37 SQL> commit;
提交完成。
22:42:40 SQL> drop table t;
表已删除。
22:42:46 SQL> rename t1 to t;
表已重命名。
22:43:00 SQL> desc t;
名称 是否为空? 类型
-------------- --------- -------------
A NUMBER
我就知道这两种常见的方法,不知道还有没有什么其他的好方法。如果有,请分享。建议使用第一种。
约束和索引都被摧残了,可以做个实验证明一下。
先建立测试表并插入数据
15:28:45 SQL> create table t (a varchar2(10) not null);
表已创建。
已用时间: 00: 00: 00.03
15:28:47 SQL> insert into t values ('10');
已创建 1 行。
已用时间: 00: 00: 00.00
15:28:55 SQL> commit;
提交完成。
已用时间: 00: 00: 00.00
然后增加一个列,并且把数据复制过去
15:29:08 SQL> alter table t add (b number);
表已更改。
已用时间: 00: 00: 00.01
15:29:31 SQL> update t set b=to_number(a);
已更新 1 行。
已用时间: 00: 00: 00.01
15:29:42 SQL> commit;
提交完成。
已用时间: 00: 00: 00.00
15:29:45 SQL> alter table t modify b not null;
表已更改。
已用时间: 00: 00: 00.10
在原来的列上建立索引和约束
15:29:59 SQL> create index ind_t_a on t(a);
索引已创建。
已用时间: 00: 00: 00.15
15:31:01 SQL> alter table t add constraint uk_t_a unique(a);
表已更改。
已用时间: 00: 00: 00.03
斗转星移:
15:31:20 SQL> alter table t drop column a;
表已更改。
已用时间: 00: 00: 01.20
15:32:06 SQL> alter table t rename column b to a;
表已更改。
已用时间: 00: 00: 00.03
查看索引是否还在?可以看到索引已经被损坏了:
15:33:17 SQL> select index_name,status from user_indexes where table_name='T';
未选定行
已用时间: 00: 00: 00.12
15:34:20 SQL> select index_name,status from user_indexes order by 1;
INDEX_NAME STATUS
------------------------------ --------
PK_DEPT VALID
PK_EMP VALID
已用时间: 00: 00: 00.35
然后查看约束是否还在?可以看到它也被摧残了
15:38:07 SQL> select constraint_name,constraint_type,invalid,table_name from user_constraints where table_name='T';
CONSTRAINT_NAME CONSTRAINT_TYPE INVALID TABLE_NAME
------------------------------ -------------------- ------- -----------
SYS_C005423 C T
已用时间: 00: 00: 00.03
15:38:24 SQL> select constraint_name,constraint_type,invalid,table_name from user_constraints;
CONSTRAINT_NAME CONSTRAINT_TYPE INVALID TABLE_NAME
------------------------------ -------------------- ------- ------------
BIN$lNdA2W97SK69TBAu945o7w==$0 C BIN$W9ZnSgtTS9+Fs/438TqKuA==$0
BIN$6JXde6KdTsum1GYM3py1eg==$0 C BIN$W9ZnSgtTS9+Fs/438TqKuA==$0
SYS_C005423 C T
FK_DEPTNO R EMP
PK_DEPT P DEPT
PK_EMP P EMP
已选择6行。
已用时间: 00: 00: 00.23