Oracle在表中有数据的情况下修改字段类型或长度的解决方法

Oracle 数据库如何在表中有数据的情况下,修改表字段的类型或者增加表字段的长度解决方法

我们偶尔需要在已有表,并且有数据的情况下,修改其某个字段的类型或改变他的长度,但是因为表中有数据,所以不可以直接修改,需要换个思路。

-- Create table
create table TABLE1
(
  col1 number(9),
  col2 char(20)
);
-- 尝试修改
-- 修改成功,因为表中无数据
ALTER TABLE TABLE1 MODIFY COL1 NUMBER(10); 

-- 插入数据
INSERT INTO TABLE1 (COL1, COL2) VALUES (1, 'test');

-- 再次尝试修改
-- 修改失败,因为表中已有数据,不允许直接操作
ALTER TABLE TABLE1 MODIFY COL2 VARCHAR2(20);

-- 先缓存表
CREATE TABLE T_TABLE1 AS SELECT * FROM TABLE1;

-- 删除原表所有数据
DELETE FROM 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 = 'test'; 是没有数据的,需要SELECT * FROM TABLE1 WHERE TRIM(COL2) = 'test';

-- 增加一个新字段,用于缓存原字段信息
ALTER TABLE 表名 ADD 新字段 VARCHAR(2000);

-- 将原字段值复制到新字段上缓存
UPDATE 表名 SET 新字段 = 原字段;

-- 现将原字段值清空,以便于修改字段大小
UPDATE 表名 SET 原字段 = null;

-- 修改原字段
ALTER TABLE 表名 MODIFY 原字段 VARCHAR(2000);

-- 将新字段值复制到原字段
UPDATE 表名 SET 原字段 = 新字段;

-- 删除字段
ALTER TABLE 表名 DROP COLUMN 新字段;

到此这篇关于Oracle在表中有数据的情况下修改字段类型或长度的文章就介绍到这了,更多相关Oracle修改字段类型或长度内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • oracle in长度限制的两个快速解决方法

    发现问题 在oracle中,in的最大条数是1000条,当超过1000条就会报错: oracle in长度限制的解决方法,将列转为行 但是字符串又会有长度限制,所以参考方法二 方法一: SELECT REGEXP_SUBSTR('17,20,23','[^,]+',1,LEVEL) AS STR FROM DUAL CONNECT BY LEVEL <= LENGTH('17,20,23')-LENGTH(REGEXP_REPLACE('17,20,23',',','')) + 1 这里还有一个

  • Oracle的CLOB大数据字段类型操作方法

    一.Oracle中的varchar2类型 我们在Oracle数据库存储的字符数据一般是用VARCHAR2.VARCHAR2既分PL/SQL Data Types中的变量类型,也分Oracle Database中的字段类型,不同场景的最大长度不同. 在Oracle Database中,VARCHAR2 字段类型,最大值为4000:PL/SQL中 VARCHAR2 变量类型,最大字节长度为32767. 当 VARCHAR2 容纳不下我们需要存储的信息时,就出来的Oracle的大数据类型LOB( La

  • oracle求字符串长度函数length()和hengthb()简介

    lengthb(string)计算string所占的字节长度:返回字符串的长度,单位是字节 length(string)计算string所占的字符长度:返回字符串的长度,单位是字符 对于单字节字符,LENGTHB和LENGTH是一样的. 如可以用length('string')=lengthb('string')判断字符串是否含有中文. 注: 一个汉字在Oracle数据库里占多少字节跟数据库的字符集有关,UTF8时,长度为三. select lengthb('飘') from dual   可查

  • Oracle截取字符串去掉字段末尾指定长度的字符

    lengthb(string)计算string所占的字节长度:返回字符串的长度,单位是字节 length(string)计算string所占的字符长度:返回字符串的长度,单位是字符 eg: //去掉该字段后面15位字符串 select t.depre_name, substr(t.depre_name, 0, (length(t.depre_name) - 16)) from table t where t.del_flag = '0' [备注]一个汉字在Oracle数据库里占多少字节跟数据库的

  • Oracle数据库表名支持的最大长度是多少

    本文介绍Oralce数据库中,表名可以使用的最大长度.这个长度也是Oracle标识符的最大长度,为30个字符. 小编今天在建一个Oracle数据库表时,提示如下表名长度超过了最大值了.错误如下: 复制代码 代码如下: 错误报告: SQL 错误: ORA-00972: 标识符过长 00972. 00000 -  "identifier is too long" *Cause:    An identifier with more than 30 characters was specif

  • 详解Oracle修改字段类型方法总结

    最近学习了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-

  • Oracle在表中有数据的情况下修改字段类型或长度的解决方法

    Oracle 数据库如何在表中有数据的情况下,修改表字段的类型或者增加表字段的长度解决方法 我们偶尔需要在已有表,并且有数据的情况下,修改其某个字段的类型或改变他的长度,但是因为表中有数据,所以不可以直接修改,需要换个思路. -- Create table create table TABLE1 ( col1 number(9), col2 char(20) ); -- 尝试修改 -- 修改成功,因为表中无数据 ALTER TABLE TABLE1 MODIFY COL1 NUMBER(10);

  • Mysql表数据比较大情况下修改添加字段的方法实例

    前言 如果一张表在后期的维护中,发现需要加字段以满足当下的需求,但是数据量很大有百万甚至千万级的数据,要如何修改表字段呢. 直接执行使用alter语句肯定是不现实的,这涉及到锁表重建表结构等操作,假设这时候还有其他线程在跑,等一天都改不过来. 这里整理一个比较简单的方法 1.对照要操作的表结构创建一张临时表 CREATE TABLE product_copy LIKE product; 2.将要修改的表结构改在临时表上面 3.导出表product数据,并导入到零时表product_copy 4.

  • CMD下执行Go出现中文乱码的解决方法

    目录 1.报错信息如下 2.原因分析 3.解决方法 4.封装处理乱码方法 5.解决乱码完整代码 1.报错信息如下 2.原因分析 因为Go的编码是UTF-8,而CMD的活动页是cp936(GBK),因此产生乱码.在中文Windows系统中,如果一个文本文件是UTF-8编码的,那么在CMD.exe命令行窗口(所谓的DOS窗口)中不能正确显示文件中的内容.在默认情况下,命令行窗口中使用的代码页是中文或者美国的,即编码是中文字符集或者英文字符集. 3.解决方法 golang处理中文时默认是utf8,当遇

  • Windows下在CMD下执行Go出现中文乱码的解决方法

    在cmd下运行go程序或者是GOLAND的Terminal下运行go程序会出现中文乱码的情况. go run ttypemain.go ���� Ping  [127.0.0.1] ���� 32 �ֽڵ�����: ���� 127.0.0.1 �Ļظ�: �ֽ�=32 ʱ��<1ms TTL=128 ���� 127.0.0.1 �Ļظ�: �ֽ�=32 ʱ��<1ms TTL=128 ���� 127.0.0.1 �Ļظ�: �ֽ�=32 ʱ��<1ms TTL=128 ����

  • CentOS 7下MySQL服务启动失败的快速解决方法

    今天,启动MySQL服务器失败,如下所示: [root@spark01 ~]# /etc/init.d/mysqld start Starting mysqld (via systemctl): Job for mysqld.service failed because the control process exited with error code. See "systemctl status mysqld.service" and "journalctl -xe&qu

  • Windows 8.1下MySQL5.7 忘记root 密码的解决方法

    [背景] 最近学习碰到了一件挺令人尴尬的事情,我把MySQL的密码给忘记了,所以MySQL登录不进去. 网上的解决方案很多,尝试了很多,依旧是被窗口的各种报错虐.感谢大神的助力,MySQL忘记密码解决方案才得以清晰,希望本篇博客的解决过程可以帮到读者. [问题解决过程] 一.跳过MySQL的权限审查进入MySQL 首先,找到MySQL的my.ini配置文件. 然后,打开文件,在mysqld下,添加一句代码 skip-grant-tables ,以跳过权限的审核. 很重要的一步:win+R 输入s

  • Vue 2.5.2下axios + express 本地请求404的解决方法

    最近在学习Vue,今天尝试了使用axios模拟本地网络请求.使用的过程中发现接口请求一直404,后来发现在当期的Vue-cli构建的最新的项目中,接口请求应该这样写. 1.引入相关依赖 var axios = require('axios') const express = require('express'); var app = express(); var apiRoutes = express.Router(); app.use('/api', apiRoutes); 2.处理网络请求

  • js的form表单提交url传参数(包含+等特殊字符)的两种解决方法

    方法一:(伪装form表单提交) linkredwin = function(A,B,C,D,E,F,G){ var formredwin = document.createElement("form"); formredwin.method = 'POST'; document.body.appendChild(formredwin); formredwin.action = "http://www.A.com/A.wiki?A=" +encodeURI(A) +

  • nginx 下安装配置 phpadmin报错的解决方法

    如下所示: 系统版本:centos7.0 64位 NGINX版本:nginx version: nginx/1.9.8 PHP版本:PHP 7.0.0 (cli) (built: Dec  1 2015 17:53:27) ( NTS ) mysql版本:mysqld  Ver 5.7.10 phpmyadmin版本:4.5.2-all-languages 部署完phpmyadmin,访问主页报错: Error during session start; please check your PH

随机推荐