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 '注释内容'; //修改表的注释
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值