一、问题:

  昨天想要修改Oracle数据库中某张表的某个字段,发现怎么都修改不成功!!!并给出了如下提示:

  ORA-54031:要删除或修改的列由某个虚拟列表达式使用 

二、啥是“虚拟列” 【不可见的列】

  虚拟列的创建一般是数据库自动创建的,当然也可以手动创建。

  什么时候创建:表中的数据,大量或频繁的发生变化的时候,数据库一般会自动创建虚拟列!

  我觉得截一个漂亮的图,比我的一个字一个字的敲的更容易理解!哈哈哈!

  Oralce 的虚拟列解决了以前很多需要使用触发器或者需要通过代码进行计算统计才能产生的数据信息。以前每次对其他的列进行统计,产生新列的时候都是采用在select 语句中通过统计计算增加新列的方法,执行效率很低,而且由于使查询SQL语句变得冗长、复杂很容易出错。严重的降低了开发效率和程序的执行效率。Oralce虚拟列的引入解决了这个问题。

  Oralce 的虚拟列也有一些问题。不能使用insert into talbe_name values ().语句,在向含有虚拟列的表中添加数据时,要求insert语句的必须把添加的表的列名写出来。insert into table_name (list1,list2,...listend)列名中不能出现虚拟列名,否则会提示错误。

    下面罗列一下解决方案:

二、几种解决方案

(1)先备份数据,备份表结构,再delete该表,再创建表(修改列信息),再导入数据!

    数据量少的时候,无所谓,可以这么做,但是如果数据量过多,那么弊端就很明显了!

(2)drop当前虚拟列。流程如下:

 --:查询指定表的虚拟列信息:
--select column_name,data_default,hidden_column
--from user_tab_cols
--where table_name='CB_BATCH_FLOW' AND column_name='BFL_OPRNO' --说明:修改步骤:
--(1)先查询user_tab_cols表.列的虚拟列data_default字段的信息,取其中的HASH值
--(2)如果(1)查到了HASH值,才需要执行exec 删除该列的虚拟列操作,如果没有查找HASH值,则不需要删除虚拟列
--(3)删除虚拟列之后,此时可以alter
--格式:
-- exec dbms_stats.drop_extended_stats('ebank','CB_BATCH_FLOW','BFL_CSTNO,CCP_USERID)'); ---删除虚拟列
-- alter table CB_BATCH_FLOW modify BFL_CSTNO varchar2(10);                         ---修改列信息
-- select dbms_stats.create_extended_stats('ebank','CB_BATCH_FLOW','(CCP_CSTNO,CCP_USERID)') FROM DUAL; ---新增虚拟列

执行截图:

1、exec  执行方法参数传入错误

2、成功删除虚拟列

3、成功创建一个虚拟列

但是,成功创建的虚拟列的在:user_tab_cols表中的COLUMN_NAME字段存入的值是随机的,

 

ORACLE-1:虚拟列影响alter修改表字段操作!的更多相关文章

  1. orcle增删改操作及alter修改表字段操作

    orcle增删改操作:操作前确保当前用户有增删改的权限. --创建表 create table itcast( pid ), pname ) ); drop table itcast; --复制表 c ...

  2. Oracle 11g 虚拟列 Virtual Column介绍

    Oracle 11G 虚拟列 Virtual Column Oracle 11G 在表中引入了虚拟列,虚拟列是一个表达式,在运行时计算,不存储在数据库中,不能更新虚拟列的值. 定义一个虚拟列的语法: ...

  3. mysql中修改表字段名/字段长度/字段类型详解

    在mysql中我们对数据表字段的修改命令只要使用alter就可以了,下面我来给大家详细介绍mysql中修改表字段名/字段长度/字段类型等等一些方法介绍,有需要了解的朋友可参考. 先来看看常用的方法 M ...

  4. MySQL修改表的默认字符集和修改表字段的默认字符集

    修改表的默认字符集: ALTER TABLE table_name DEFAULT CHARACTER SET character_name; 修改表字段的默认字符集: ALTER TABLE tab ...

  5. atitit查询表修改表字段没反应--解锁锁定的表

    atitit查询表修改表字段没反应--解锁锁定的表 查询表修改表字段没反应 要是使用gui 没反应,最好使用cmd 方式,不卉不个gui 锁上.. ALTER TABLE t_mb_awardweix ...

  6. db2中修改表字段的长度,查看表字段长度,以及查看表字段已存放值大小

    修改表字段语句: alter table 表名 alter column  字段名 set data type varchar(7700) 如: ALTER TABLE JV_BI_BACK_OPER ...

  7. MySQL修改表字段相关信息

    昨天收获颇多,首先回顾一下有关mysql的内容. 我在查询表信息时,出现了 empty set 0.00 sec 的错误,我很奇怪,仔细检查发现原来是表字段名称写错了, 于是我想修改字段名称,经过查询 ...

  8. MySQL知识补充(表字段操作、视图、触发器、事物、存储过程、内置函数、流程控制、索引、慢查询)

    今日内容概要 表字段操作补充(掌握) 视图(了解) 触发器(了解) 事务(掌握) 存储过程(了解) 内置函数(了解) 流程控制(了解) 索引(熟悉) 内容详细 1.表字段操作补充 # 1.添加表字段 ...

  9. MySQL 表字段操作

    MySQL 表字段操作 一.增加表字段 1)mysql> alter table 二.删除表字段 三.修改表字段

随机推荐

  1. jq添加和移除事件的方法,prop和attr

    会在写条件判断的时候遇到,今天在判断没有剩余产品的时候,移除事件.当有产品的时候添加事件: 移除onClick事件: $("a").removeAttr("onclick ...

  2. python3之scrapy安装使用

    需要安装的包 pip install scrapy selenium 可能需要卸载重装的模块   lxml cryptography  cffi  pypiwin32 pip uninstall xx ...

  3. EasyUI 读数据库图

    EasyUI 读数据库图 function edit_dg() { //选中一行,获取这一行的主键值 var idImg = $("#tbDeviceClassBrowstab") ...

  4. 类的特殊成员方法,类的起源type, metaclass

    1.__doc__表示类的描述信息 2. __module__ 和  __class__  __module__ 表示当前操作的对象在那个模块 __class__     表示当前操作的对象的类是什么 ...

  5. WP8.1通过StreamSocket连接C++服务器

    注:当服务端和手机模拟器运行在一台机器时,会有奇怪错误.将服务端放在其它机器上更改客户端连接地址,运行正常.或者直接用本机modern调试也可以. 实例化一个对象 StreamSocket clien ...

  6. mybatis 控制器注解介绍(一)

    @RequestMapping("LoginController")public class LoginController { // 路径参数{name}填入用户名,{pass} ...

  7. 【phonegap】下载文件

    <!-- 打包的时候phonegap自己会添加这个文件--> <script type="text/javascript" charset="utf-8 ...

  8. Py修行路 python基础 (十四)递归 及 面向对象初识及编程思想

    一.递归 1.定义: 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. (1)递归就是在过程或函数里调用自身: (2)在使用递归策略时,必须有一个明确的递归结束条件 ...

  9. 点击jQuery Mobile的按钮改变颜色

    jquery-mobile-移动 我有这样的代码来改变点击一个按钮的颜色: $('.fav').live('click', function(e) { $(this).buttonMarkup({ t ...

  10. Tornado 高并发源码分析之五--- IOLoop 对象

    IOLoop主要工作 1.将TCPServer 注册到 IOLoop 的事件记到 _handlers 字段,同时注册 READ 和 ERROR 事件到 epoll 2.IOLoop 启动一个大循环,负 ...