admin 管理员组文章数量: 1087139
2024年3月20日发(作者:matlab安装教程百度网盘)
删除数据库中所有表的存储数据
----同时不改变表的结构
方法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。
注:所有内容汇总自网络。
版权声明:本文标题:删除数据库中所有表中的数据,同时保留表的结构和约束。 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://roclinux.cn/b/1710945903a580855.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论