oracle表 中删除一列

1、测试

在sys用户下创建测试表:

SQL> create table t  as select object_id,object_name from dba_objects;
表已创建。

SQL> select count(*)from t ;
 COUNT(*)
----------

48940

删除object_name 列:

SQL> alter table t drop column object_name;
alter table t drop column object_name
*
第 1 行出现错误:
ORA-12988: cannot drop column from table owned by SYS

我去。。。在sys用户下面的表是不能删除列的。。。。这下肿么办?简单。。。换个表空间,换个用户解决:

SQL> create table scott.t2 tablespace users as select  * from t ;
表已创建。

给表建个索引,一会测试用:

SQL> create index i_t1 on t2(object_id);
索引已创建。

 SQL> select segment_name,partition_name,segment_type,tablespace_name,bytes,blocks,extents from user_segments where segment_name like '%T2%' ;

SEGMENT_NAME    PARTITION_NAME      SEGMENT_TYPE       TABLESPACE      BYTES   BLOCKS   EXTENTS
---------------                     --------------------           ------------------               ----------               ----------      ------            -------
I_T2                                                                           INDEX                     USERS                 983040      120             15
T2                                                                               TABLE                    USERS                 2097152    256             17

删除列,需要一段时间,其中会牵涉到表内锁的锁定。

SQL> alter table t2 drop column object_id;
表已更改。
再次查询段结构:
SQL> select segment_name,partition_name,segment_type,tablespace_name,bytes,blocks,extents from user_segments where segment_name like '%T2%';

SEGMENT_NAME    PARTITION_NAME      SEGMENT_TYPE       TABLESPACE      BYTES   BLOCKS   EXTENTS
---------------                     --------------------           ------------------               ----------               ----------      ------            -------
T2                                                                               TABLE                    USERS                 2097152    256             17

索引也会一并删除的。。。。

注意:在大表上删除列的时候,一定要注意,它会花费很长的时间,锁住表,影响数据库性能。

在oracle数据库中,还有一种方法用来删除列:

SQL> alter table t2 set unused column object_id;
表已更改。

这条语句的意思是把object_id置为不可用,更改此列的名称(oracle内部明白),但是不会释放此列对应的空间。(我测试的时候,如果删除的列时索引列,然后再去找索引就找不到了,查得dba_indexes视图中的index_name 没有了,总行数也少了一行。猜测应该是索引也重命名了,已经不是索引了。但是空间估计也不会释放的。没有测试。。。)这个执行非常快,和truncate的机制差不多,在生产库中如果需要紧急应用,为了避免drop column操作锁住表,可以使用这个语句。等到系统有充足的时间时,我们再用另一个语句来释放空间:

alter table t2 drop unused columns;

表已更改。

这个操作是比较慢的。。

时间: 2024-12-25 04:28:43

oracle表 中删除一列的相关文章

如何在一个1亿行的大oracle表中删除1千万行数据

要在一个1亿行的大表中,删除1千万行数据 在对数据库其他应用影响最小的情况下,以最快的速度完成 那么操作期间应该注意什么?如果中途中断了,有木有方法再继续? 如果应用不可停,又该怎么办呢? 删除了10分之一的数据,索引可能还需重建,统计信息可能也得更新 由于昂贵的delete操作,Undo空间亚历山大.Redo log 也要担心被撑爆 而且批量delete虽然影响最小,但是可能会造成大量的空数据块 如此种种,剪不断.理还乱.是删除,别是一番滋味在心头啊 很显然,删除或更新的方法和数据库的设计及软

如何在一个1亿行的大oracle表中删除1千万行数据的第二种思路

思路二: CTAS + RENAME 因为要在对数据库及其他应用影响最小的情况下做 如果直接对表进行删除则会出现应用因为等待数据释放锁而等待 而且常规的DELETE语句,会生成大量的UNDO和REDO 而且表上如果有大量索引的话,导致删除还会更慢 而且可能会造成大量的空数据块,如果有扫描大量行的操作,空块太多,也会导致性能下降 如果可以停止业务,防止对此表的更新 那么CTAS + RENAME也是个不赖的选择 这种方法只适用于没有业务发生的情况,对于大多数OLTP系统还是不适用的 由于CTAS是

Oracle表中含有255列以上是需要注意的(r12笔记第77天)

   今天看JL(Jonathan Lewis)的一篇文章,真是费了不少的脑细胞,玩Oracle几十年的老司机,看问题的角度和深度果然不一样,当时看他的大作<Oracle核心技术>就花了我不少时间,还没有看完,一本薄薄的书能够蕴含如此的能量,做技术到了这个火候,让人深深佩服.    他的一篇博文,标题很简单,就是"255 again"看来是一个很经典的问题,我就简单抓取一些测试的思路和脚本来说说. 原文在链接 https://jonathanlewis.wordpress.

在oracle一个有60万记录的表中删除几十条记录怎么用了很长时间?

oracle 在oracle一个有60万记录的表中删除几十条记录怎么用了很长时间?

Oracle库中删除表出现问题,求助

问题描述 Oracle库中删除表出现问题,求助 在Oracle数据库中删除了几张表,但之后查看的时候发现莫名奇妙的多了几张表,不知道是之前的表没有被删除自己改了个名字还是怎么回事.无解. 就是下面这个状况,求大神解惑 解决方案 是的,就改名了. drop table test purge,这才是彻底删除.

oracle-为什么用plsql删除Oracle表中的字段,过一段时间怎么几个字段又出来了

问题描述 为什么用plsql删除Oracle表中的字段,过一段时间怎么几个字段又出来了 为什么删除Oracle数据库中某张表的字段,怎么过一会几个字段又出来了呢??? 用的hibernate和spring,, 这个是什么情况 解决方案 会不会是hibernate自动帮你建的啊?

如何写SQL实现:在数据表中增加一列,该列的值是出库数的累加 (按制单日期升序累加)

问题描述 如何写SQL实现:在数据表中增加一列,该列的值是出库数的累加 (按制单日期升序累加) 如上图,在数据表中增加一列[累计出库数],累计出库数的值等于出库数的累加数(按制单日期升序累加),如何写SQL实现 解决方案 Oracle有现成的lead,lag函数 其他数据库看下面我的博客 sqlserver http://blog.csdn.net/danielinbiti/article/details/45308867 mysqlhttp://blog.csdn.net/danielinbi

Python如何将一个列表写入到一个excel表中的一列,求Python代码,谢啦!

问题描述 Python如何将一个列表写入到一个excel表中的一列,求Python代码,谢啦! Python如何将一个列表写入到一个excel表中的一列,求Python代码,谢啦! 解决方案 有python的excel库,可以直接调用继续插入这里是这个库的链接https://pypi.python.org/pypi/xlrd 解决方案二: 找python读写excel的组件,即可搞定. 解决方案三: from pyExcelerator import * w = Workbook() #创建一个

MSSQL如何在没有主键的表中删除重复数据

原文:MSSQL如何在没有主键的表中删除重复数据 为了对重复数据进行实验,下面建一个设计不太好(没有主键)表并插入了一些重复数据: create database testdb use testdb ; go create table DupsNoPK (Col1 int Null, Col2 char(5) Null ); go insert DupsNoPK(Col1,Col2) Values(1,'abc'), (2,'abc'), (2,'abc'), (2,'abc'), (7,'xy