oracle中修改有数据的表的字段类型 博客分类: Oracle学习记录自学记录 oracle表格式的重新定义
程序员文章站
2024-03-06 12:15:14
...
【修改时会涉及到数据类型转换,小心】
在修改列的长度时候,只能编辑比现有字段实际存的长度还要大,否则提示下面的错误:
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 '注释内容'; //修改表的注释
在修改列的长度时候,只能编辑比现有字段实际存的长度还要大,否则提示下面的错误:
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 '注释内容'; //修改表的注释