2011-04-24 53 views
0

我有一个庞大的数据库与复杂的关系,我如何删除所有表内容而不违反外键约束,有没有这样的方式来做到这一点?清空数据库的内容

请注意,我写一个SQL脚本文件来删除表,如下面的例子:

delete from A 
delete from B 
delete from C 
delete from D 
delete from E 

,但我不知道我应该开始什么表。

+0

notee,我不想删除整个数据库 – qablan89 2011-04-24 08:26:52

回答

2

在SQL Server中,有做你的要求没有原生的方式。根据您的特定环境限制,您确实有几个选项:

  1. 找出表格之间的关系,并开始按照从foreigns到父母的适当顺序删除行。这对于大量的对象来说可能是耗时的,但对于最小的破坏来说是“最安全的”。
  2. 禁用外键约束和TRUNCATE TABLE。如果你处理大量数据,这会更快一些,但你仍然需要知道你所有的关系在哪里。如果您使用的表格数量较少,则不会太糟糕,尽管选项1变得同样可行
  3. 编写数据库对象和DROP DATABASE/CREATE DATABASE。如果您不关心数据库的原始拆卸,这是另一种选择,但是,您仍然需要了解创建的对象优先级。 SQL Server以及第三方工具提供了脚本对象DROP/CREATE的方法。如果你决定走这条路线,好处是你可以对所有对象进行脚本备份(我喜欢保留“以防万一”),并且只要你的脚本保持同步,未来的下载几乎是即时的任何变化。

正如你所看到的,这不是一个非常简单的过程,因为你试图破坏约束存在的原因。

0
TRUNCATE TABLE tableName 

删除表中的所有行,而不 登录个人行删除。 TRUNCATE TABLE类似于没有WHERE子句的 DELETE语句;然而,TRUNCATE TABLE更快,并且 使用更少的系统和事务日志 资源。

TRUNCATE TABLE (Transact-SQL)

+0

抱歉,但我想要一个脚本来运行它在C#程序这个脚本应该包含一些删除表语句是这个好吗? – qablan89 2011-04-24 08:32:27

+0

只要任何FK约束引用表..... – 2011-04-24 08:32:50

+0

是的,现在我应该对表进行排序,以便包含FK的表首先被删除,而表中的Pk被删除最后? – qablan89 2011-04-24 08:39:32

0

老兄,把你的问题在面值...你要完全重新创建无数据的架构......忘记了个人查询(太慢了)......只是destroydb,然后创建b(或任何你的RDBM的等价物)......并且你可能想雇用一个合格的DBA。

2

步骤可以是:

  1. 禁用所有的所有表中
  2. 从所有表中删除所有记录
  3. 再次启用约束约束。

也看到这个讨论:SQL: delete all the data from all available tables

+0

谢谢,我认为这是非常好的解决方案,我会测试它在我的情况 – qablan89 2011-04-24 08:54:09