Oracle修改字段类型方法总结

有一个表名为tb,字段段名为name,数据类型nchar(20)。

1、假设字段数据为空,则不管改为什么字段类型,可以直接执行:
alter table tb modify (name nvarchar2(20));
2、假设字段有数据,则改为nvarchar2(20)可以直接执行:

alter table tb modify (name nvarchar2(20));

3、假设字段有数据,则改为varchar2(40)执行时会弹出:“ORA-01439:要更改数据类型,则要修改的列必须为空”,这时要用下面方法来解决这个问题


/*修改原字段名name为name_tmp*/
alter table tb rename column name to name_tmp;
/*增加一个和原字段名同名的字段name*/
alter table tb add name varchar2(40);
/*将原字段name_tmp数据更新到增加的字段name*/
update tb set name=trim(name_tmp);
/*更新完,删除原字段name_tmp*/
alter table tb drop column name_tmp;

总结:
1、当字段没有数据或者要修改的新类型和原类型兼容时,可以直接modify修改。
2、当字段有数据并用要修改的新类型和原类型不兼容时,要间接新建字段来转移。
### Oracle 数据库字段类型概述 Oracle 数据库提供了多种字段类型(也称为数据类型),用于定义表中列的属性以及存储的数据种类。这些数据类型可以根据用途分为以下几类:数值型、字符型、日期时间型、大对象型以及其他特殊类型。 #### 数值型数据类型 - **NUMBER(p,s)** 用于存储固定精度和比例的数字,其中 `p` 表示总位数,`s` 表示小数点后的位数。例如,`NUMBER(5,2)` 可以表示最大值为 `999.99` 的数字[^2]。 #### 字符型数据类型 - **CHAR(n)** 固定长度字符串,最多可容纳 2000 个字符。即使实际输入少于指定长度,也会自动填充空格至满长度[^3]。 - **VARCHAR2(n)** 可变长度字符串,支持的最大大小取决于数据库配置,默认情况下可达 4000 字节[^3]。 - **NCHAR(n)** 和 **NVARCHAR2(n)** 支持 Unicode 编码的字符集,分别对应固定的 NCHAR 和可变长度的 NVARCHAR2[^1]。 #### 时间日期型数据类型 - **DATE** 存储标准日历日期与时钟时间的信息,范围从公元前 4712 年到公元后 9999 年,并精确到秒级[^1]。 - **TIMESTAMP[(fractional_seconds_precision)]** 提供更高精度的时间戳功能,能够记录微秒甚至纳秒级别的差异[^1]。 - **INTERVAL YEAR TO MONTH**, **INTERVAL DAY TO SECOND** 特殊类型的间隔数据类型,用来保存两个时刻之间的差值,适用于复杂的业务逻辑计算需求。 #### 大对象(LOB)数据类型 - **BLOB** / **CLOB** / **NCLOB** BLOB 用于二进制大数据流;CLOB 和 NCLOB 则针对大型文本资料,区别在于后者支持多国语言环境下的编码方式。 - **LONG** 老式的长字符串类型,已被 CLOB 所取代,在现代开发实践中不建议继续使用因为其存在诸多限制条件[^2]。 #### 其他复合或自定义结构化类型 - **ROWID** 内部物理地址指针,唯一标识某一行的位置信息。 - **RAW/ LONG RAW** 原始比特序列形式储存未解释过的原始数据块,比如图片文件等内容。 - 用户定义类型 UDT(User Defined Type),包括 Object Types , Varray Collections and Nested Tables 等高级特性。 --- ### 修改字段类型方法总结 当需要调整现有表内某个特定字段的数据类型时,有两种主要途径可供选择: 1. 如果目标列已含有有效数据,则推荐先重命名原列再新增一列作为过渡桥梁完成迁移过程最后删除旧版副本; ```sql -- 示例脚本展示如何安全变更 id_no 字段规格 ALTER TABLE g3_userinfo RENAME COLUMN ID_NO TO OLD_ID_NO; ALTER TABLE g3_userinfo ADD NEW_ID_NO VARCHAR2(20); UPDATE g3_userinfo SET NEW_ID_NO = CAST(OLD_ID_NO AS VARCHAR2(20)); ALTER TABLE g3_userinfo DROP COLUMN OLD_ID_NO; ``` 2. 若该列为完全空白状态可以直接调用 MODIFY 动作简化操作步骤, ```sql ALTER TABLE your_table_name MODIFY (your_column_name new_data_type); ``` 然而需要注意的是第二种方案仅限无现存记录的情形下才可行否则会产生错误提示[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值