`
huangningren
  • 浏览: 43504 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

一次性删除数据库内所有表数据

阅读更多
一次性删除数据库内所有表数据
删除数据库中某个表数据的方法并不复杂,为什么还要多此一举呢?

一是这里介绍的是删除数据库的所有数据,因为数据之间可能形成相互约束关系,删除操作可能陷入死循环,
二是这里使用了微软未正式公开的sp_MSForEachTable存储过程。
也许很多朋友都经历过这样的事情:要在开发数据库基础上清理一个空库,但由于对数据库结构缺乏整体了解,在删除一个表的记录时,删除不了,因为可能有外键约束,一个常见的数据库结构是一个主表,一个子表,这种情况下一般都得先删除子表记录,再删除主表记录。
说道删除数据记录,往往马上会想到的是delete和truncate语句,但在遇到在两个或多个表之间存在约束的话,这两个语句可能都会失效,而且最要命的是这两个命令都只能一次操作一个表。那么真正遇到要删除SQL Server数据库中所有记录时,该怎么办呢?有两个选择:
1.按照先后顺序逐个删除,这个方法在表非常多的情况下显得很不现实,即便是表数量不多,但约束比较多时,你还是要花费大量的时间和精力去研究其间的约束关系,然后找出先删哪个表,再删哪个表,最后又删哪个表。

2.禁用所有约束,删除所有数据,最后再启用约束,这样就不用花时间和精力去研究什么约束了,只需要编写一个简单的存储过程就可以自动完成这个任务。
从这两个选择中不难看出第二个选择是最简单有效的了,那么在使用第二个选择时,具体该怎么实施呢?
首先得编写代码循环检查所有的表,这里我推荐一个存储过程sp_MSForEachTable,因为在微软的官方文档中没有对这个存储过程有描述,很多开发人员也许都还未曾听说,所以你在互联网上搜索得到的解决办法大多很复杂,也许有的人会认为,既然没有官方文档,这个存储过程可能会不稳定,打心理上会排斥它,但事实并非如此。下面来先看一个完整的脚本:
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 ?'
EXEC sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL'
EXEC sp_MSForEachTable 'ALTER TABLE ? ENABLE TRIGGER ALL'
EXEC sp_MSFOREACHTABLE 'SELECT * FROM ?'
GO
这个脚本创建了一个命名为sp_DeleteAllData的存储过程,前面两行语句分别禁用约束和触发器,第三条语句才是真正地删除所有数据,接下里的语句分别还原约束和触发器,最后一条语句是显示每个表中的记录,当然这条语句也可以不要,只是确认一下是否清空了所有表而已。
你可以在任何数据库上运行这个存储过程,当然不要在生成数据库上运行,不管怎样,还是先备份一下数据库,使用备份数据库还原,然后再运行该存储过程,数据库就成一个空库了。
分享到:
评论

相关推荐

    一次性删除数据库所有表和所有存储过程 SQL语句

    一次性删除数据库所有表和所有存储过程 SQL语句 希望可以帮助大家 我自己试过很好使用的

    数据库数据删除工具

    删除数据库数据,包括删除,清除功能,二者均删除表中的全部行,"清楚"数据删除表中的所有行,但表结构及其列、约束、索引等保持不变.新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用 "删除

    删除数据库表中的父节点以及其子节点

    使用存储过程删除数据库表中具有父子关系的数据,删除父节点,则将其父节点以及子节点删除,使用数据库广度遍历

    java一次性查询处理几百万数据解决方法

    java一次性查询处理几百万数据解决方法 几百万数据是可以处理的 暂时还没试过几千万级的数据处理

    Kettle实现多表数据全量抽取

    Kettle实现多张表数据的定时删除全量抽取,删除旧shuju

    达梦数据库_SQL语言手册

    修改操作的对象也可以是元组的集合,相对于面向记录的数据库语言一次只能操作一条记录来 语言的使用简化了用户的处理,提高了应用程序的运行效率 语言简洁,方便易学 语言功能强大,格式规范,表达简洁,接近英语的语法...

    数据库安全检查表.xls

    检查项目,检测内容,说明,检查方法,检查脚本 帐号及口令安全,是否删除不必要的帐号,应删除与数据库运行、维护等工作无关的帐号,脚本,"方法一: DB2企业管理器-〉安全性-〉登陆中删除无关帐号; DB2企业管理器-〉...

    数据库灾难性恢复(数据库技术;灾难性;恢复;数据备份)

    (2)数据库数据已经存在,但是无法正常使用,提示错误,都应归属为数据修复,举例说明:SQL SERVER文件打开提示LDF文件损坏,或错误823等等。 数据库恢复实际上就是利用技术手段把不可见或不可正常运行的数据文件恢复...

    一次性清空数据表sql

    对很多表进行删除操作时,能够比较方便!!!

    1数据库设计规范.doc

    设计规范 1 规范约定 遵守数据的设计规范3NF 规定 表内的每一个值都只能被表达一次。 表内的每一行都应该被唯一的标识(有唯一键)。 表内不应该存储依赖于其他键的非键信息。 2 字段规范 一行记录必须表内唯一,表...

    Access 2000数据库系统设计(PDF)---025

    1487.2.5 将字段数据类型转换为Access数据类型 1497.2.6 使用链接表管理器加载项重新链接表 1507.2.7 导入表和将数据库文件链接为表 1507.3 导入和链接电子数据表文件 1517.3.1 通过导入Excel工作表创建一个表 1517....

    旅行社数据库系统.doc

    这次课程设计主要介绍旅行社数据库的设计过程,本系统具有对相关数据的查询, 修改,删除等功能,较之于之前的相关类系统具有更简便,更实用的有点,但是由于技 术的不成熟,又具有不完整,结构不清晰等缺点。...

    数据库资料

    ——信誉值大于5的用户才能够加入会员列表 …… 完整性包括… 实体完整性域完整性引用完整性自定义完整性表操作创建数据库表 SQL Server的数据类型思考创建数据库表思考创建数据库表思考选择主键的原则创建数据库表...

    数据库设计说明书模板

    因为上报中要求对变更进行上报,当采集系统不能提供变更情况时,需要上报系统根据当天数据和前一次存储的数据进行比较之后才能知道发生了哪些业务变更。因此本系列的表需要对上报的数据保存本期和两期的数据。 CDBEC...

    Firebird数据库中文版

    我们可以在触发器中写入PSQL语句,默认值,产生异常,firebird现在支持统一触发器,即可以一个触发器中,一次性管理插入,更新,删除的操作。 扩展函数: 我们可以使用C语言,C++,DELPHI写UDF,使用UDF(用户定义...

    数据库操作语句大全(sql)

    3),例如:在一个外部表中导入数据,由于某些原因第一次只导入了一部分,但很难判断具体位置,这样只有在下一次全部导入,这样也就产生好多重复的字段,怎样删除重复字段 alter table tablename --添加一个自增列 ...

    学生成绩管理系统数据库设计.doc

    触发器可以侦测到数据库内数 据的操作,并自动地级联影响到整个数据库的操作,从而保证数据库数据的完整性和一 致性。例如:在某一个学生退学删除学生基本信息以后,那么该学生相应的成绩信息也 应该被删除。可以...

    存储图数据的数据库FlockDB.zip

    图的每一条边都被存储了两次:一次正向存储(根据源ID做索引和分块),一次反向存储(根据目的ID做索引和分块)。这样类似于“谁在关注我”这样的查询可以跟查询“我在关注谁”一样高效,并且所有结果数据都分布在同一块...

    python PyMySQL 数据库操作

    一次性添加2条记录(文件一) b.根据用户输入的标题删除记录(文件二) """ # 引入模块 from Ab import Ab_MySQL # 实例化对象 A1 = Ab_MySQL() # 创建表 create_str = """ create table news( new_id int unsigned ...

    SQL数据库修复软件

    SQL数据库损坏 SQL数据库修复软件 SQL数据库0字节 SQL系统表损坏 SQL误删除恢复 SQL 误删除表恢复 我们的修复率在100%,如果您已经尝试多家公司,请不妨再交给我们做,我们已经多次救援过被判‘死刑’的数据库。...

Global site tag (gtag.js) - Google Analytics