SQL truncate和delete的区别 (转)

TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少。   DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项。
TRUNCATE TABLE 通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。
TRUNCATE,DELETE,DROP放在一起比较:
TRUNCATE TABLE:删除内容、释放空间但不删除定义。
DELETE TABLE:删除内容不删除定义,不释放空间。
DROP TABLE:删除内容和定义,释放空间。

Src:http://zhidao.baidu.com/question/171481100.html?fr=ala1
简单的说:
truncate删除表比较快,但删除的数据不能恢复,只能删除表中的所有数据
而delete删除比truncate慢,删除的数据可以恢复,后面可以跟where条件删除某些指定记录。
前者不可rollback 
后者可以rollback
 
============================例子================================
============================Demo================================
delete from aa
truncate table aa

区别
1。delete from后面可以写条件,truncate不可以
2。delete from记录是一条条删的,所删除的每行记录都会进日志,而truncate一次性删掉整个页,因此日至里面只记录页释放,简言之,delete from更新日志,truncate基本不,所用的事务日志空间较少
3。delete from删空表后,会保留一个空的页,truncate在表中不会留有任何页
4。当使用行锁执行 DELETE 语句时,将锁定表中各行以便删除。truncate始终锁定表和页,而不是锁定各行。
5。如果有identity产生的自增id列,delete from后仍然从上次的数开始增加,即种子不变,而truncate后,种子会恢复初始
6。truncate不会触发delete的触发器,因为truncate操作不记录各个行删除

Src:http://zhidao.baidu.com/question/171481100.html?fr=ala1

======================================================================

======================================================================

TRUNCATE和DELETE有以下几点区别
1、TRUNCATE在各种表上无论是大的还是小的都非常快。如果有ROLLBACK命令DELETE将被撤销,而TRUNCATE则不会被撤销。
2、TRUNCATE是一个DDL语言,向其他所有的DDL语言一样,他将被隐式提交,不能对TRUNCATE使用ROLLBACK命令。
3、TRUNCATE将重新设置高水平线和所有的索引。在对整个表和索引进行完全浏览时,经过TRUNCATE操作后的表比DELETE操作后的表要快得多。
4、TRUNCATE不能触发任何DELETE触发器。
5、不能授予任何人清空他人的表的权限。
6、当表被清空后表和表的索引讲重新设置成初始大小,而delete则不能。
7、不能清空父表。
Src:http://zhidao.baidu.com/question/18445397.html?fr=ala0
===========================================================================
===========================================================================
           TRUNCATE TABLE [TABLENAME]; 删除数据库表中的数据,效率上高于delete,
后面不能加限制条件,加限制条件只能使用delete from [tablename] where ``````
           DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项。TRUNCATE TABLE 通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。

  TRUNCATE TABLE 删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用 DELETE。如果要删除表定义及其数据,请使用 DROP TABLE 语句。

  对于由 FOREIGN KEY 约束引用的表,不能使用 TRUNCATE TABLE,而应使用不带 WHERE 子句的 DELETE 语句。由于 TRUNCATE TABLE 不记录在日志中,所以它不能激活触发器。

  TRUNCATE TABLE 不能用于参与了索引视图的表。
 
------------------------------------------------------------------delete 数据恢复方法------------------------------------------------------------------------
--现在有一张学生表 : student
select * from student t for update;
delete from student where sid = 1008 ;  
-- 加nologging 不能使用别名
delete from student nologging where sid='1002'   
truncate table student where sid = 1008
-- 现在还不知道delete from studnet nologging 和 truncate table studnet
-- 有什么具体的区别,希望谁看完后有什么补充的话给我留言,谢谢进行交流。

---1,求当前时间
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') FROM DUAL; --2008-12-20 22:05:32
--2,删除数据的表 - student
--只能查出delete的数据。即上面第一种删除。
SELECT *
FROM student AS OF TIMESTAMP TO_TIMESTAMP('2008-12-20 22:05:00', 'YYYY-MM-DD HH24:MI:SS')
where sid = '1004'
--3.根据你查询出来的需要恢复数据在重新插入
INSERT INTO student
(SELECT *
FROM student AS OF TIMESTAMP TO_TIMESTAMP('2008-12-20 22:05:00', 'YYYY-MM-DD HH24:MI:SS')
where sid = '1004');
posted @ 2012-04-20 23:52  sidihu  阅读(1018)  评论(0编辑  收藏  举报