oracle中修改有数据的表的字段类型

【修改时会涉及到数据类型转换,小心】
在修改列的长度时候,只能编辑比现有字段实际存的长度还要大,否则提示下面的错误:
  ORA-01441: 无法减小列长度, 因为一些值过大
此处对oracle中数据类型转换做一个小结:
oracle数据类型转换规律:
(1)比较时,一般是字符型转换为数值型,字符型转换为日期型
(2)算术运算时,一般把字符型转换为数值型,字符型转换为日期型
(3)连接时(||),一般是把数值型转换为字符型,日期型转换为字符型
(4)赋值、调用函数时,以定义的变量类型为准。


第一种方式【本人推荐,生产中比较实用】(使用辅助字段)
{实验环境准备}
create table t_person(
id varchar2(200) primary key,
name varchar2(200),
address varchar2(200)
);

desc t_person;
SQL> desc t_person
Name Type     Nullable Default Comments
-------   ------------- -------- ------- --------
ID       VARCHAR2(200)                          
NAME     VARCHAR2(200)   Y                       
ADDRESS  VARCHAR2(200)   Y 

insert into t_person(id,name,address) values(sys_guid(),'zhangsan','beijing');
insert into t_person(id,name,address) values(sys_guid(),'lisi','shangqiu');

想把address的varchar2类型改为clob类型

(1)

alter table t_person rename column address to myaddress;

把原字段换个名字,address改为myaddress

(2)

alter table t_person add address clob;

在表中添加一个原字段名字 address 并把类型定义为自己想改变的类型,这里是clob

(3)

update t_person set address = myaddress;

把备份的myaddress字段内容添加到新建字段address中来

(4)
alter table t_person drop column myaddress;

把备份字段myaddress删除

SQL> desc t_person
Name Type     Nullable Default Comments
------- ------------- -------- ------- --------
ID        VARCHAR2(200)                          
NAME      VARCHAR2(200) Y                       
ADDRESS         CLOB    Y

第二种方法(使用辅助表)
【实验环境模拟】
create table TABLE1
(
  col1 number(9),
  col2 char(20)
);
//尝试修改
ALTER TABLE TABLE1 MODIFY COL1 NUMBER(10); --修改成功,因为表中无数据

//插入数据
INSERT INTO TABLE1 (COL1, COL2) VALUES (1, 'aaa');
//再次尝试修改
ALTER TABLE TABLE1 MODIFY COL2 VARCHAR2(20);--修改失败,因为表中已有数据,不允许直接操作
//创建辅助表T_TABLE1
CREATE TABLE T_TABLE1 AS SELECT * FROM TABLE1;
//删除原表所有数据
truncate table TABLE1;
//修改字段
ALTER TABLE TABLE1 MODIFY COL1 NUMBER(9);--修改成功
ALTER TABLE TABLE1 MODIFY COL2 VARCHAR2(20);--修改成功
//插入原数据
INSERT INTO TABLE1 SELECT * FROM T_TABLE1;
//删除缓存表
DROP TABLE T_TABLE1;
//注意,如果是CHAR类型,不足位数会自动用空格补齐,所以谨慎使用CHAR类型,并可用TRIM()验证是否有符合条件的记录。
//初始表结构时,SELECT * FROM TABLE1 WHERE COL2 = 'aaa‘; 是没有数据的,需要SELECT * FROM TABLE1 WHERE TRIM(COL2) = 'aaa';

5.给表加注释

  comment column on 表名.列名 is '注释内容';   //修改表的列的注释

  COMMENT ON TABLE MOVO_NEW.TEST_SAKTE  IS '注释内容';  //修改表的注释

猜你喜欢

转载自1050113483.iteye.com/blog/2247977