删除数据库中所有表中的数据,同时保留表的结构和约束。

删除数据库中所有表中的数据,同时保留表的结构和约束。


2024年1月20日发(作者:)

删除数据库中所有表的存储数据

----同时不改变表的结构

方法1:delete

delete from [表的名字]

delete语句每次删除一行,并在事物中为所删除的每一行做记录,所以delete可以回滚,操作可以撤销。

假如表中有自增序列(从1开始自增1),一共有3条数据,先delete三行再添加一行,那么现在自增序列的将是4。

方法2:truncate

truncate Table.[dbo].[表的名字]

truncate方法可以删除数据,保留表的结构。

truncate是DDL语言,将被隐式提交,不调用rollback(回滚)命令,因而也无法撤销。

truncate将重新设置高水平线和所有索引,在对整个表和索引进行浏览时,经过truncate操作后的表比delete操作后的表要快得多。

truncate不能触发delete出触发器。

truncate清空表中数据之后,将重新设置成初始大小,而delete不能。

truncate不能清空父表。

假如表中有自增序列(从1开始自增1),一共有3条数据,先truncate再添加一行,那么现在自增序列的将是1。

方法3:利用游标

delete和truncate只能一个表一个表的删除,方法3利用游标遍历数据库中所有表,逐个删除。

use [数据库的名字]

declare @tablename varchar(max)

declare havetable cursor for select [name] from sysobjects where xtype='U' //声明游标

open havetable //打开游标

fetch next from havetable into @tablename //移动游标到第一个数据表

WHILE @@FETCH_STATUS = 0 //循环条件

begin

exec('delete from '+ @tablename) //或者用truncate

fetch next from havetable into @tablename //移动游标到下一个数据表

end

close havetable //关闭游标

deallocate havetable //释放游标

DUMP TRANSACTION [数据库名字] WITH NO_LOG //选择性添加此命令

方法4:执行微软自带的系统存储过程

该方法最简单有效,请使用前先备份数据库,以免造成损失。

CREATE PROCEDURE sp_DeleteAllData

AS

EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL' //禁用约束

EXEC sp_MSForEachTable 'ALTER TABLE ? DISABLE TRIGGER ALL' //禁用触发器

EXEC sp_MSForEachTable 'DELETE FROM ?' //或改为'truncate TABLE ?'

EXEC sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL' //启用

EXEC sp_MSForEachTable 'ALTER TABLE ? ENABLE TRIGGER ALL' //启用触发器

EXEC sp_MSFOREACHTABLE 'SELECT * FROM ?' //验证

GO

EXEC sp_DeleteAllData

GO

注:执行存储过程注意释放,可能比较占用内存,也可以不按照存储过程执行,直接执行几条EXEC语句。

也许很多读者朋友都经历过这样的事情:要在开发数据库基础上清理一个空库,但由于对数据库结构缺乏整体了解,在删除一个表的记录时,删除不了,因为可能有外键约束,一个常见的数据库结构是一个主表,一个子表,这种情况下一般都得先删除子表记录,再删除主表记录。

说道删除数据记录,往往马上会想到的是delete和truncate语句,但在遇到在两个或多个表之间存在约束的话,这两个语句可能都会失效,而且最要命的是这两个命令都只能一次操作一个表。那么真正遇到要删除SQL Server数据库中所有记录时,该怎么办呢?有两个选择:

1.按照先后顺序逐个删除,这个方法在表非常多的情况下显得很不现实,即便是表数量不多,但约束比较多时,你还是要花费大量的时间和精力去研究其间的约束关系,然后找出先删哪个表,再删哪个表,最后又删哪个表。

2.禁用所有约束,删除所有数据,最后再启用约束,这样就不用花时间和精力去研究什么约束了,只需要编写一个简单的存储过程就可以自动完成这个任务。

从这两个选择中不难看出第二个选择是最简单有效的了,这就是本方法的主体思路。 编写代码循环检查所有的表,这里推荐一个存储过程sp_MSForEachTable。

注:所有内容汇总自网络。


发布者:admin,转转请注明出处:http://www.yc00.com/news/1705758318a1421086.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信