oracle修改表字段的数据类型的测试
思路
将要更改类型的字段名改名新字段以备份;
根据需求,添加一个与要更改类型的字段名同名的字段(原字段已经改名),
然后更新数据,
最后删除改名备份的字段
脚本如下:
/*修改原字段名*/
ALTER TABLE 表名 RENAME COLUMN 字段名 TO 字段名1;
/*添加一个和原字段同名的字段*/
ALTER TABLE 表名 ADD 字段名 VARCHAR2(30);
/*将原来的数据更新到新字段中一定要显示进行数据类型转换*/
UPDATE 表名 SET 字段名 = CAST(字段名1 AS VARCHAR2(30));
/*删除原来的备份字段*/
ALTER TABLE 表名 DROP COLUMN 字段名1;
测试如下:
1.备份表
SQL> create table tt_bak_01 as select * from tt;
Table created.
2.想偷懒,现实直接修改字段如下: SQL> alter table tt modify (DATA_OBJECT_ID number);
alter table tt modify (DATA_OBJECT_ID number)
*
ERROR at line 1:
ORA-01439: column to be modified must be empty to change datatype
不行,只得转变方法
3.检查表结构
SQL> desc tt
Name Null? Type
-------------------------------------------------------------------- -------- ----------------------------------------------
OWNER VARCHAR2(30)
OBJECT_NAME VARCHAR2(128)
SUBOBJECT_NAME VARCHAR2(30)
OBJECT_ID NUMBER
DATA_OBJECT_ID NUMBER
OBJECT_TYPE VARCHAR2(19)
CREATED DATE
LAST_DDL_TIME DATE
TIMESTAMP VARCHAR2(19)
STATUS VARCHAR2(7)
TEMPORARY VARCHAR2(1)
GENERATED VARCHAR2(1)
SECONDARY VARCHAR2(1)
4.备份需要修改的字段
SQL> ALTER TABLE tt RENAME COLUMN DATA_OBJECT_ID to DATA_OBJECT_ID01;
Table altered.
SQL> desc tt
Name Null? Type
-------------------------------------------------------------------- -------- ----------------------------------------------
OWNER VARCHAR2(30)
OBJECT_NAME VARCHAR2(128)
SUBOBJECT_NAME VARCHAR2(30)
OBJECT_ID NUMBER
OBJECT_TYPE VARCHAR2(19)
CREATED DATE
LAST_DDL_TIME DATE
TIMESTAMP VARCHAR2(19)
STATUS VARCHAR2(7)
TEMPORARY VARCHAR2(1)
GENERATED VARCHAR2(1)
SECONDARY VARCHAR2(1)
DATA_OBJECT_ID VARCHAR2(100)
5.根据业务需求,添加合适的字段以及相应数据类型
SQL> ALTER TABLE tt ADD DATA_OBJECT_ID VARCHAR2(100);
Table altered.
SQL> desc tt
Name Null? Type
-------------------------------------------------------------------- -------- ----------------------------------------------
OWNER VARCHAR2(30)
OBJECT_NAME VARCHAR2(128)
SUBOBJECT_NAME VARCHAR2(30)
OBJECT_ID NUMBER
DATA_OBJECT_ID01 NUMBER
OBJECT_TYPE VARCHAR2(19)
CREATED DATE
LAST_DDL_TIME DATE
TIMESTAMP VARCHAR2(19)
STATUS VARCHAR2(7)
TEMPORARY VARCHAR2(1)
GENERATED VARCHAR2(1)
SECONDARY VARCHAR2(1)
DATA_OBJECT_ID VARCHAR2(100)
6.更新字段数据到新修改的字段中
SQL> UPDATE tt SET DATA_OBJECT_ID = CAST(DATA_OBJECT_ID01 AS VARCHAR2(100));
390 rows updated.
SQL>
检查:
SQL> select DATA_OBJECT_ID01 from tt
minus
2 3 select to_number(DATA_OBJECT_ID) from tt;
no rows selected
7.删除备份的字段结构
SQL> ALTER TABLE tt DROP COLUMN DATA_OBJECT_ID01;
Table altered.
SQL> desc tt;
Name Null? Type
-------------------------------------------------------------------- -------- ----------------------------------------------
OWNER VARCHAR2(30)
OBJECT_NAME VARCHAR2(128)
SUBOBJECT_NAME VARCHAR2(30)
OBJECT_ID NUMBER
OBJECT_TYPE VARCHAR2(19)
CREATED DATE
LAST_DDL_TIME DATE
TIMESTAMP VARCHAR2(19)
STATUS VARCHAR2(7)
TEMPORARY VARCHAR2(1)
GENERATED VARCHAR2(1)
SECONDARY VARCHAR2(1)
DATA_OBJECT_ID VARCHAR2(100)
SQL> select count(*) from tt;
COUNT(*)
----------
390
By 老白菜
=========================================================================
-- The End --