Oracle中truncate和delete的区别

Oracle中truncate和delete的区别
删除表中的数据的方法有delete,truncate,
它们都是删除表中的数据,而不能删除表结构,delete可以删除整个表的数据也
可以删除表中某一条或N条满足条件的数据,而truncate只能删除整个表的数据,
一般我们把delete操作收作删除表,而truncate操作叫作截断表.
truncate操作与delete操作对比
操作 回滚 高水线 空间 效率
Truncate
不能 下降 回收 快
delete
可以 不变 不回收 慢

下面分别用实例查看它们的不同
1.回滚
首先要明白两点
1.在oracle中数据删除后还能回滚是因为它把原始数据放到了undo表空间,
2.DML语句使用undo表空间,DDL语句不使用undo,而delete是DML语
句,truncate是DDL语句,别外DDL语句是隐式提交.
所以truncate操用不能回滚,而delete操作可以.
两种操作对比(首先新建一个表,并插入数据)

SQL> create table t
2 (
3 i number
4 );
Table created.
SQL> insert into t values(10);
SQL> commit;
Commit complete.
SQL> select * from t;
I
----------
10

Delete删除,然后回滚
SQL> delete from t;
1 row deleted.
SQL> select * from t;
no rows selected
#删除后回滚
SQL> rollback;
Rollback complete.
SQL> select * from t;
I
----------
10

Truncate截断表,然后回滚.
SQL> truncate table t;
Table truncated.
SQL> rollback;
Rollback complete.
SQL> select * from t;
no rows selected

可见delete删除表还可以回滚,而truncate截断表就不能回滚了.(前提是
delete操作没有提交)

2.高水线
所有的Oracle表都有一个容纳数据的上限(很象一个水库历史最高的水位),我
们把这个上限称为“high water mark”或HWM。这个HWM是一个标记(专门有一
个数据块用来记录高水标记等),用来说明已经有多少数据块分配给这个表.
HWM通常增长的幅度为一次5个数据块.

delete语句不影响表所占用的数据块, 高水线(high watermark)保持原位置不

truncate 语句缺省情况下空间释放,除非使用reuse storage; truncate会将
高水线复位
下面对两种操作对比

SQL> analyze table t estimate statistics;
Table analyzed.
SQL> select segment_name,blocks from dba_segments where segment_name=upper('t');
SEGMENT_NAME BLOCKS
------------------------------ ----------
T 24
SQL> select table_name,blocks,empty_blocks from user_tables where table_name=upper('t');
TABLE_NAME BLOCKS EMPTY_BLOCKS
------------------------------ ---------- ------------
T 20 3

USER_TABLES.BLOCKS列代表该表中曾经使用过得数据库块的数目,即水
线。
注意:USER_TABLES.BLOCKS EMPTY_BLOCKS (20+3=23)比
DBA_SEGMENTS.BLOCKS少一个数据库块,这是因为有一个数据库块被保留

用作表头。DBA_SEGMENTS.BLOCKS表示分配给这个表的所有的数据库块的
数目。USER_TABLES.BLOCKS表示已经使用过的数据库块的数目(水线)。
Delete删除表,

SQL> delete from t;
10000 rows deleted
SQL> commit;
Commit complete.
SQL> analyze table t estimate statistics;
Table analyzed.
SQL> select table_name,blocks,empty_blocks from user_tables where table_name=upper('t');
TABLE_NAME BLOCKS EMPTY_BLOCKS
------------------------------ ----------
----------------------------------------------------------------

T 20 3

Truncate截断表
SQL> truncate table t;
Table truncated.
SQL> analyze table t estimate statistics;
Table analyzed.
SQL> select table_name,blocks,empty_blocks from user_tables where table_name=upper('t');
TABLE_NAME BLOCKS EMPTY_BLOCKS
------------------------------ ----------
--------------------------------------------------------

T 0 7
可见,delete表,BLOCK(高水线)不变,而truncate表BLOCKS(高水线)变为0
现在我们也看到blocks+empty_blocks=7,也就是oracle分配区时默认一次
7+1(表头)=8个blocks;
高水线的作用: HWM对数据库的操作有如下影响:
a)全表扫描通常要读出直到HWM标记的所有的属于该表数据库块,即使该表中没
有任何数据。
b)即使HWM以下有空闲的数据库块,键入在插入数据时使用了append关键字,
则在插入时使用HWM以上的数据块,此时HWM会自动增大。
因此高水线是oracle优化时一个重要的参数

3.空间
既然高水线用来说明已经有多少数据块分配给这个表,那么高水线也可理解为表
的空间占用。
即使delete将表中的数据全部删除,HWM还是为原值,所以还有那么多的空间
分配给这个表,即它的空间还没有回收,
而truncate表后高水线变为0,那现在它就表示没有分配空间,即它的空间被回
收了。

4.效率
要想查看delete,truncate那个效率更高,先构建一个大表,然后查看它们分别
对些表删除所需的时间。
有个相当形象的比喻:领导给你两本书让你扔掉,delete就是你守在复印机前,
把书一页页撕下来复印一份,再一页页扔到垃圾桶里,truncate就是直接把两本
书扔到垃圾桶里,那个快那个慢不言而喻。
先在表中插入100000条记录,并打开时间

SQL> set timing on;
SQL> begin
2 for i in 1..100000 loop
3 insert into t values('10');
4 commit;
5 end loop;
6 end;
7 /
PL/SQL procedure successfully completed.
Elapsed: 00:01:12.50

Delete删除表
SQL> delete from t;
100000 rows deleted.
Elapsed: 00:00:20.09

Truncate截断表
#先把表回滚
SQL> rollback;
Rollback complete.
Elapsed: 00:00:17.36
SQL> select count(*) from t;
COUNT(*)
-------------------
100000
Elapsed: 00:00:00.01
SQL> truncate table t;
Table truncated.
Elapsed: 00:00:00.20

可见删除同一个大小的表,delete用了20.09秒,而truncate只用了0.2秒.

合集下载

SQL语句中删除表数据drop、truncate和delete的用法

SQL语句中删除表数据drop、truncate和delete的用法

SQL语句中删除表数据drop、truncate和delete的⽤法SQL中的语法1、drop table 表名称drop (删除表):删除内容和定义,释放空间。

简单来说就是把整个表去掉.以后要新增数据是不可能的,除⾮新增⼀个表。

drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger)索引(index);依赖于该表的存储过程/函数将被保留,但其状态会变为:invalid。

2、truncate table 表名称truncate (清空表中的数据):删除内容、释放空间但不删除定义(保留表的数据结构)。

与drop不同的是,只是清空表数据⽽已。

注意:truncate 不能删除⾏数据,要删就要把表清空。

3、delete from 表名称 where 列名称 = 值delete (删除表中的数据):delete 语句⽤于删除表中的⾏。

delete语句执⾏删除的过程是每次从表中删除⼀⾏,并且同时将该⾏的删除操作作为事务记录在⽇志中保存,以便进⾏进⾏回滚操作。

之间的区别1、truncate与不带where的delete :只删除数据,⽽不删除表的结构(定义)2、truncate table 删除表中的所有⾏,但表结构及其列、约束、索引等保持不变。

如果想保留标识计数值,请改⽤delete。

3、如果要删除表定义及其数据,请使⽤ drop table 语句。

4、执⾏速度,⼀般来说: drop> truncate > delete。

5、delete语句是数据库操作语⾔(dml),这个操作会放到 rollback segement中,事务提交之后才⽣效;如果有相应的 trigger,执⾏的时候将被触发。

6、truncate、drop 是数据库定义语⾔(ddl),操作⽴即⽣效,原数据不放到 rollback segment 中,不能回滚,操作不触发 trigger。

drop和delete的本质区别

drop和delete的本质区别

drop和delete的本质区别
drop和delete的本质区别如下
1、从删除内容上区分:
truncate和delete只删除数据不删除表的结构(定义)
drop语句将删除表的结构、被依赖的约束(constrain),触发器(trigger),索引(index);依赖于该表的存储过程/函数将保留,但是变为invalid状态。

2、从语句类型上来区分:
delete语句是dml,这个操作会放到rollbacksegement中,事务提交之后才生效;如果有相应的trigger,执行的时候将被触发。

truncate,drop是ddl,操作立即生效,原数据不放到rollbacksegment中,不能回滚。

操作不触发trigger。

3、从对表空间的影响来区分:
delete语句不影响表所占用的extent,高水线(highwatermark)保持原位置不动,drop语句将表所占用的空间全部释放。

truncate语句缺省情况下将空间释放到minextents个extent,除非使用reusestorage;而且truncate会将高水线复位(回到最开始)。

4、从速度的区别:
一般来说:drop>truncate>delete。

oracle清空表的语句

oracle清空表的语句

oracle清空表的语句摘要:I.简介- 介绍Oracle数据库- 介绍清空表的语句II.清空表的语句- 删除表中所有记录- 使用TRUNCATE TABLE语句- 使用DROP TABLE语句III.注意事项- 避免数据丢失- 确保操作合法IV.结论- 总结清空表的语句- 强调谨慎操作正文:I.简介Oracle是一种广泛使用的关系型数据库管理系统,其强大的功能和稳定性深受用户的喜爱。

在Oracle数据库中,清空表的语句是经常用到的操作。

它可以用于删除表中所有记录,以便重新填充数据或进行其他操作。

II.清空表的语句在Oracle数据库中,有三种清空表的语句:1.删除表中所有记录使用DELETE语句可以删除表中所有满足特定条件的记录。

例如:```sqlDELETE FROM table_name WHERE condition;```其中,`table_name`是表名,`condition`是删除记录的条件。

2.使用TRUNCATE TABLE语句TRUNCATE TABLE语句可以快速删除表中的所有记录,但无法回滚此操作。

例如:```sqlTRUNCATE TABLE table_name;```其中,`table_name`是表名。

3.使用DROP TABLE语句DROP TABLE语句可以删除整个表,包括表结构和相关数据。

例如:```sqlDROP TABLE table_name;```其中,`table_name`是表名。

III.注意事项在清空表时,需要注意以下几点:1.避免数据丢失清空表时,务必确保已经备份了重要数据,以防止数据丢失。

2.确保操作合法在进行清空表的操作时,请确保您具有合法的权限。

否则,可能会导致操作失败或数据泄露。

IV.结论总之,在Oracle数据库中,清空表的语句有多种方法,包括DELETE、TRUNCATE TABLE和DROP TABLE。

oracle删除表语句

oracle删除表语句

oracle删除表语句删除表(记录和结构)的语名delete ———— truncate ———— drop DELETE (删除数据表⾥记录的语句) DELETE FROM表名 WHERE 条件; 注意:删除记录并不能释放ORACLE⾥被占⽤的数据块表空间. 它只把那些被删除的数据块标成unused. 如果确实要删除⼀个⼤表⾥的全部记录, 可以⽤ TRUNCATE 命令, 它可以释放占⽤的数据块表空间 TRUNCATE TABLE 表名; 此操作不可回退. 相同点 truncate和不带where⼦句的delete, 以及drop都会删除表内的数据 注意:这⾥说的delete是指不带where⼦句的delete语句 不同点: 1. truncate和 delete只删除数据不删除表的结构(定义) drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger),索引(index); 依赖于该表的存储过程/函数将保留,但是变为invalid状态. 2.delete语句是dml,这个操作会放到rollback segement中,事务提交之后才⽣效;如果有相应的trigger,执⾏的时候将被触发. truncate,drop是ddl, 操作⽴即⽣效,原数据不放到rollback segment中,不能回滚. 操作不触发trigger. 3.delete语句不影响表所占⽤的extent, ⾼⽔线(high watermark)保持原位置不动 显然drop语句将表所占⽤的空间全部释放 truncate 语句缺省情况下见空间释放到 minextents个 extent,除⾮使⽤reuse storage; truncate会将⾼⽔线复位(回到最开始). 4.速度,⼀般来说: drop>; truncate >; delete 5.安全性:⼩⼼使⽤drop 和truncate,尤其没有备份的时候.否则哭都来不及 使⽤上,想删除部分数据⾏⽤delete,注意带上where⼦句. 回滚段要⾜够⼤. 想删除表,当然⽤drop 想保留表⽽将所有数据删除. 如果和事务⽆关,⽤truncate即可. 如果和事务有关,或者想触发trigger,还是⽤delete. 如果是整理表内部的碎⽚,可以⽤truncate跟上reuse stroage,再重新导⼊/插⼊数据 oracle中删除表中的⼀列语句 alter table 表名 drop colum 列名。

truncate关键字问题

truncate关键字问题

TRUNCATE 快速地从一堆表中删除所有行。

它和在每个表上进行无条件的 DELETE 有同样的效果,不过因为它不做表扫描,因而快得多。

在大表上最有用。

truncate,delete,drop 异同点注意:这里说的delete是指不带where子句的delete语句相同点truncate和不带where子句的delete, 以及drop都会删除表内的数据不同点:1.truncate和 delete只删除数据不删除表的结构(定义)drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger),索引(index); 依赖于该表的存储过程/函数将保留,但是变为invalid状态.2.delete语句是dml,这个操作会放到rollback segement中,事务提交之后才生效;如果有相应的trigger,执行的时候将被触发.truncate,drop是ddl, 操作立即生效,原数据不放到rollback segment中,不能回滚. 操作不触发trigger.3.delete语句不影响表所占用的extent, 高水线(high watermark)保持原位置不动显然drop语句将表所占用的空间全部释放truncate 语句缺省情况下见空间释放到 minextents个 extent,除非使用reuse storage; truncate会将高水线复位(回到最开始).4.速度,一般来说: drop>; truncate >; delete5.安全性:小心使用drop 和truncate,尤其没有备份的时候.否则哭都来不及使用上,想删除部分数据行用delete,注意带上where子句. 回滚段要足够大.●想删除表,当然用drop●想保留表而将所有数据删除. 如果和事务无关,用truncate即可. 如果和事务有关,或者想触发trigger,还是用delete.●如果是整理表内部的碎片,可以用truncate跟上reuse stroage,再重新导入/插入数据个人总结,欢迎大家补充可是事务中的DDL语句会引起COMMIT的啊,我在应用中使用truncate删除某个表的数据后,装入其他数据,后面的处理出错后,能回滚成原来的数据。

oracle truncate 条件语句

oracle truncate 条件语句

一、什么是Oracle Truncate语句Oracle Truncate语句是一种用于清空表格中所有数据的SQL语句。

它可以快速地清空表格,而且比使用Delete语句更加高效。

Truncate 语句会永久删除表格中的所有数据,并且无法通过Rollback语句来恢复这些数据。

二、Oracle Truncate语句的使用方法在Oracle数据库中,使用Truncate语句可以轻松清空表格中的数据。

Truncate语句的基本语法如下所示:Truncate table 表格名;三、Oracle Truncate语句的注意事项1. Truncate语句会立即释放表格所占用的存储空间,所以在使用Truncate语句之前需要确保表格中不再包含任何重要数据。

2. Truncate语句无法满足带有条件的清空数据需求,它只能删除整个表格中的数据,而无法根据条件删除部分数据。

3. 在使用Truncate语句时需要谨慎,因为它会直接清空表格中的数据,一旦执行不慎,数据将无法被恢复。

四、如何使用条件语句在Oracle中清空数据虽然Oracle的Truncate语句无法满足带有条件的清空数据需求,但是我们可以借助其他方法来实现类似的功能。

在Oracle中,我们可以使用Delete语句来针对特定条件清空数据。

五、使用Delete语句清空特定条件的数据在Oracle数据库中,我们可以使用Delete语句加上Where子句来清空表格中符合条件的数据。

Delete语句的基本语法如下所示:Delete from 表格名 where 条件;六、Delete语句的注意事项1. 在使用Delete语句清空数据时,需要谨慎操作,确保删除的数据符合业务需求。

2. Delete语句会逐行地删除符合条件的数据,所以在处理大量数据时需要考虑性能和效率问题。

3. Delete语句操作后,删除的数据是可以通过Rollback语句进行恢复的,不会像Truncate语句一样永久删除数据。

oracle删除表语法

oracle删除表语法Oracle是一种广泛使用的关系型数据库管理系统,它提供了丰富的SQL语法来操作数据库。

在Oracle中,删除表是一个常见的操作,本文将介绍如何使用Oracle的删除表语法。

要删除表,首先需要使用DROP TABLE语句,后面跟上要删除的表名。

例如,要删除名为"employees"的表,可以使用以下语法:DROP TABLE employees;在执行这条语句之前,请确保已经备份了重要的数据。

因为删除表将永久删除表中的所有数据,这是一个不可逆的操作。

如果要删除的表不存在,Oracle将会抛出一个错误。

为了避免这种情况,可以在DROP TABLE语句中使用IF EXISTS关键字。

例如:DROP TABLE IF EXISTS employees;这样,如果employees表不存在,Oracle将不会抛出错误。

除了删除整个表,还可以使用DELETE语句删除表中的部分数据。

DELETE语句可以使用WHERE子句指定要删除的行的条件。

例如,要删除名为"employees"表中工资小于5000的员工记录,可以使用以下语法:DELETE FROM employees WHERE salary < 5000;这条语句将删除满足条件的所有行。

在删除表之前,还可以使用TRUNCATE TABLE语句清空表中的数据,而不删除表本身。

TRUNCATE TABLE语句与DELETE语句的区别在于,TRUNCATE TABLE语句是一个DDL(数据定义语言)语句,而DELETE语句是一个DML(数据操纵语言)语句。

TRUNCATE TABLE语句比DELETE语句更快,因为它不会记录每个被删除的行,而是直接释放表空间。

例如,要清空名为"employees"的表,可以使用以下语法:TRUNCATE TABLE employees;在执行TRUNCATE TABLE语句之前,同样要确保已经备份了重要的数据。

sqlserver delete 和 truncate

sqlserver delete 和 truncate SQL Server中的DELETE和TRUNCATE是用于删除数据的两个不同的命令。

它们在语法和功能上有一些区别。

在本文中,我们将详细介绍这两个命令,包括其使用场景、影响和性能等方面的比较。

DELETE命令用于从表中删除数据行,可以根据指定的条件删除行。

它的语法如下:DELETE FROM表名WHERE条件;每当执行DELETE命令时,SQL Server将删除与指定条件匹配的行。

可以使用多个条件和逻辑运算符来指定删除的条件。

例如,可以使用以下语句删除表中age大于30并且性别为男的记录:DELETE FROM表名WHERE age > 30 AND性别= '男';DELETE命令是逐行删除的,这意味着每一行都会被扫描和删除。

因此,它在处理大量数据时可能会比较慢。

另一方面,TRUNCATE命令用于从表中删除所有数据,并重置表的标识列(如果有的话)。

它的语法如下:TRUNCATE TABLE表名;执行TRUNCATE命令时,SQL Server将直接删除整个表的数据。

与DELETE不同,TRUNCATE命令不需要指定条件。

它一次性删除所有行,因此对于大型表来说,TRUNCATE比DELETE高效得多。

尽管TRUNCATE命令对于删除大量数据非常快,但它具有一些限制。

首先,TRUNCATE命令无法回滚,即删除的数据无法恢复。

其次,由于TRUNCATE是直接删除数据,而不是逐行扫描删除,所以它不会触发DELETE触发器。

另外,TRUNCATE命令还会重置标识列,这意味着下一个插入操作将从表的起始位置重新开始计数。

在处理数据的速度和效率方面,TRUNCATE通常比DELETE快得多。

这是因为TRUNCATE命令实际上是通过截断表并释放分配给表的存储空间来删除数据。

相比之下,DELETE命令需要扫描和删除每一行数据。

然而,DELETE命令提供了更多的灵活性。

SQL语句中Truncate table、Delete与Drop table的区别

Truncate table、Delete与Drop table的区别TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行。

但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少。

DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项。

TRUNCATE TABLE 通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。

TRUNCATE TABLE 删除表中的所有行,但表结构及其列、约束、索引等保持不变。

新行标识所用的计数值重置为该列的种子。

如果想保留标识计数值,请改用 DELETE。

如果要删除表定义及其数据,请使用 DROP TABLE 语句。

对于由 FOREIGN KEY 约束引用的表,不能使用 TRUNCATE TABLE,而应使用不带 WHERE 子句的 DELETE 语句。

由于 TRUNCATE TABLE 不记录在日志中,所以它不能激活触发器。

TRUNCATE TABLE 不能用于参与了索引视图的表。

上面是sql联机丛书上说的,似乎很少有书提到truncate table,也似乎很少用到它。

今天看到一个问题则正是需要它。

问题:有一个拥有1亿条数据的表,只需要保留其中的5条,其他删除,如何做?这就需要用truncate table来搞定了,如下:select 5条数据 into #临时表 from 1亿条数据的表truncate table 1亿条数据的表insert 1亿条数据的牛X表 select * from #临时表drop table #临时表由于Truncate 是DDL命令,所以执行过程中原数据不放在Rollback Segment中,不产生回滚数据,不产生Redo Log 。

Truncate , Drop等DDL命令都是隐含提交的。

使用Truncate将会:1.清除相应索引(不是Drop,仍然保留extent) ;2.受外键参考的约束(FOREIGN KEY).当然必须先DISABLE或DROP相应的外键参考,才能TRUNCATE,注意没有CASCADE选项 .3.不触发DELETE触发器4.若使用了DROP STORAGE(缺省), 除了已指定的MINEXTENTS,其它EXTENT重新分配NEXT_EXTENT设置MINEXTENTS之后的EXTENT,High-Water Mark复位指向表中的第一个BLOCK。

sqlserver delete 和 truncate

sqlserver delete 和truncateSQL Server中的DELETE和TRUNCATE是两种常用的数据操作命令,用于删除表中的数据。

尽管它们看起来很相似,但它们在一些重要方面有所不同。

本文将一步一步解释DELETE和TRUNCATE的用途、区别以及如何在SQL Server中正确使用它们。

第一部分:DELETE命令DELETE命令用于删除表中的数据行。

它的语法如下:DELETE FROM 表名WHERE 条件;删除数据的过程是逐行进行的,因此DELETE命令可能会比较慢,特别是在处理大量数据时。

然而,DELETE命令的一个重要特点是可以通过条件选择要删除的特定数据行。

DELETE命令的使用示例:假设我们有一个名为"Employees"的表,并且想要删除其中工资低于5000的员工:DELETE FROM Employees WHERE Salary < 5000;该命令将删除"Employees"表中所有工资低于5000的员工。

DELETE命令的注意事项:- 使用DELETE命令时要小心,特别是在没有指定WHERE条件的情况下。

在这种情况下,DELETE命令将删除表中的所有数据行,这可能是一个灾难性的操作。

- 注意使用事务来确保数据操作的完整性。

如果DELETE命令错误地删除了一些数据行,您可以使用回滚操作恢复到原始状态。

第二部分:TRUNCATE命令TRUNCATE命令用于删除表中的所有数据行,但保留表的结构。

相对于DELETE命令,TRUNCATE命令通常更快,特别是在处理大量数据时。

它的语法如下:TRUNCATE TABLE 表名;TRUNCATE命令将重置表的自增主键和标识列,将它们的值重设为初始值。

TRUNCATE命令的使用示例:假设我们仍然有一个名为"Employees"的表,现在想要删除其中的所有数据行:TRUNCATE TABLE Employees;该命令将删除"Employees"表中的所有数据行,但保留表的结构。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档