Oracle 中truncate与delete的区别[转]

摘要:
如果使用truncate来清除数据,则被删除的数据表在内存表空间中占用的空间将立即释放,这相当于在Windows中使用shift+delete来删除数据,并且无法恢复!
truncate是oracle中独有的关键字吧!它的作用是清空一个表格,在删除数据方面,其与delete有一些区别,以便自己记住:


1、在功能上,truncate是清空一个表的内容,它相当于delete from table_name。
2、delete是dml操作,truncate是ddl操作;因此,用delete删除整个表的数据时,会产生大量的roolback,占用很多的rollback segments, 而truncate不会。
3、在内存中,用delete删除数据,表空间中其被删除数据的表占用的空间还在,便于以后的使用,另外它是“假相”的删除,相当于windows中用delete删除数据是把数据放到回收站中,还可以恢复,当然如果这个时候重新启动系统(OS或者RDBMS),它也就不能恢复了!
而用truncate清除数据,内存中表空间中其被删除数据的表占用的空间会被立即释放,相当于windows中用shift+delete删除数据,不能够恢复!
4、truncate 调整high water mark 而delete不;truncate之后,TABLE的HWM退回到 INITIAL和NEXT的位置(默认)delete 则不可以。
5、truncate 只能对TABLE,delete 可以是table,view,synonym。
6、TRUNCATE TABLE 的对象必须是本模式下的,或者有drop any table的权限 而 DELETE 则是对象必须是本模式下的,或被授予 DELETE ON SCHEMA.TABLE 或DELETE ANY TABLE的权限。
7、在外层中,truncate或者delete后,其占用的空间都将释放。
8、truncate和delete只删除数据,而drop则删除整个表(结构和数据)。

delete 用法

Oracle Delete Statements 
Version 10.2 

Basic Delete Statements 
1.Delete All Rows: DELETE <table_name>
                               or
                               DELETE FROM <table_name>; 
                               CREATE TABLE t AS
                               SELECT *
                                FROM all_tables;

                                SELECT COUNT(*)
                                FROM t;

DELETE FROM t;

COMMIT;

SELECT COUNT(*)
FROM t;


2.Delete Selective Rows

DELETE FROM <table_name>
WHERE <condition>; 
CREATE TABLE t AS
SELECT *
FROM all_tables;

SELECT COUNT(*)
FROM t;

DELETE FROM t
WHERE table_name LIKE '%MAP';

COMMIT;

SELECT COUNT(*)
FROM t;


3.Delete From A SELECT Statement

DELETE FROM (<SELECT Statement>); 
CREATE TABLE t AS
SELECT *
FROM all_tables;

SELECT COUNT(*)
FROM t;

DELETE FROM (
SELECT * FROM t WHERE table_name LIKE '%MAP');

SELECT COUNT(*)
FROM t;


4.Delete With Returning Clause

DELETE FROM (<SELECT Statement>); 
CREATE TABLE t AS
SELECT *
FROM all_tables;

set serveroutput on

DECLARE
r urowid; 
BEGIN
DELETE FROM t
WHERE rownum = 1
RETURNING rowid INTO r;

dbms_output.put_line(r);
END;
/


5.Delete Restricted To A Partition

DELETE FROM <table_name>
PARTITION <partition_name>; 
DELETE FROM sales PARTITION (q1_2001_invoices); 
Delete From A Remote Database DELETE FROM <table_name>@<database_link> 
DELETE FROM t@remote_db

在删除大数据量时(一个表中大部分数据时),

方法:
1、先将不需要删除的数据复制到一个临时表中
2、trunc table 表
3、将不需要删除的数据复制回来。


delete只循环了一次,(去查并删)
游标循环了二次,(先查出来,再循环一次删)

免责声明:文章转载自《Oracle 中truncate与delete的区别[转]》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇在 Windows 操作系统中的已知安全标识符(Sid security identifiers)计算两个日期之间的工作日数下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

总结:MFC中一个对话框的关闭过程 .

说起来挺简单的,一个对话框关闭时要依次调用该类的DestroyWindow-OnDestroy-PostNcDestroy,根据关闭的方法不同,在这些函数之前会调用OnOK、OnCancle或者OnClose。 这里要说的是,模态对话框的消息循环要到调用了PostNcDestroy之后才真正的结束,即ContinueModal循环在这里才结束,然后类的析构...

oracle的表分区的定义与操作

一、表分区 (一)表分区的分类 1、范围分区(range) 2、散列分区(hash) 3、列表分区(list) 4、复合分区:范围-哈希(range-hash)、范围-列表(range-list) (二)范围分区: 范围分区是应用范围比较广的分区方式,它是以列的值得范围来作为分区的划分条件,将记录存放到列值所在的range分区中。 例:按照时间创建表分区。...

CentOS 6安装Oracle 11gR2数据库

1.安装环境--- 操作系统:CentOS release 6.8 (Final) oracle:Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production 【1】安装依赖包: yum -y install binutils compat-libcap1 co...

HBase1.2官方文档——Apache HBase Coprocessors

原文档地址:http://hbase.apache.org/1.2/book.html#cp ApacheHbase协处理器 Apache HBase Coprocessors HBase Coprocessors协处理器是在Google BigTable的协处理器实现之后才建模的 (http://research.google.com/people/je...

Oracle的导出和导入

(摘自:http://www.cnblogs.com/mchina/archive/2012/09/12/2678093.html) 数据库的备份操作是在整个项目运行中最重要的工作之一。 一、数据的导出和导入 数据的导出和导入是针对于一个用户的备份操作,可以按照如下的方式完成: 1、  数据的导出 在硬盘上建立一个文件夹:c:ackup; 输入exp指令...

hbck2的一些用法

一、执行 hbase org.apache.hbase.HBCK2 可以看到下面一些选择项 **示例: -d 打印debug日志 -s 跳过客户端与服务端一致性的版本检测 hbase org.apache.hbase.HBCK2 -d -s bypass 1、bypass [OPTIONS] ... HBCK2的核心功能,bypass可以将一个或多个卡...