<pre name="code" class="html">针对于此操作大家可以去先去了解一下系统表sysobjects(有上篇博客有写) ,和drop ,truncate,delete的区别。
------------删除所有表的外键约束(删除表结构(drop)的时候,删除数据(truncate;delete )的时候不用)------- DECLARE c1 cursor for select 'alter table ['+ object_name(parent_obj) + '] drop constraint ['+name+']; ' from sysobjects where xtype = 'F' open c1--创建游标 declare @c1 varchar(8000) fetch next from c1 into @c1 while(@@fetch_status=0) begin exec(@c1) fetch next from c1 into @c1 end close c1 deallocate c1 --------------------删除所有表-------------------------- use 数据库名 GO declare @sql varchar(8000) while (select count(*) from sysobjects where type='U')>0 begin SELECT @sql='drop table ' + name FROM sysobjects WHERE (type = 'U') ORDER BY 'drop table ' + name exec(@sql) end
<pre name="code" class="html"> 1. truncate 和 delete 只删除数据不删除表的结构(定义) drop 语句将删除表的结构被依赖的约束(constrain)、触发器(trigger)、索引(index);依赖于该表的存储过程/函数将保留,但是变为 invalid (无效)状态。 2. truncate 删除所有记录,重置表(最明显的是自动id归零),删除数据时不会备份;delete 删除记录,自动id继续delect删除时会有备份 是一个DDL语言,向其他所有的DDL语言一样,他将被隐式提交,不能对 truncate 使用ROLLBACK命令。 3.小心使用 drop 和 truncate,用delete并且带上where条件,当然客户那大多都会有备份三者其实没有优先级,适当的时候用适当的方法 # 想删除部分数据行用 delete,注意带上where子句. # 想删除表,当然用 drop # 想保留表而将所有数据删除,如果和事务无关,用truncate即可。如果和事务有关,或者想触发trigger,还是用delete。 # 如果是整理表内部的碎片,可以用truncate跟上reuse stroage,再重新导入/插入数据。
时间: 2024-11-01 12:17:21