清空数据库错误:因为该表正由 FOREIGN KEY 约束引用 解决办法
如下解決了五個問題
1. 清空數據
2. 有外鍵也可以, 因為是逆向刪除, 從最后一張表刪除. 且使用的是delete, 因為truncate不能對有外鍵的表
3. 種子問題, 如果表存在種子重設為0, 如不存在就不操作
4. 加了事務, 中間報錯, 有后悔機會
5. 截斷日志功能, 因為使用delete, 刪除后日志文件會增大, 可以不使用
if( object_id('pr_DataClear') is not null ) drop procedure pr_DataClear go create procedure pr_DataClear as begin transaction declare @cTblName varchar(128) declare cur_Clear cursor for select rtrim(name) from sysobjects where type = 'U' order by crdate desc open cur_Clear declare @cSQL varchar(255) fetch next from cur_Clear into @cTblName while( @@fetch_status = 0) begin set @cSQL = 'delete from ' + @cTblName print @cSQL exec( @cSQL ) if( ident_seed(@cTblName) is not null ) begin dbcc checkident( @cTblName, reseed, 0 ) print '有種子且成功重置為1' end fetch next from cur_Clear into @cTblName end close cur_Clear deallocate cur_Clear commit go -- 清空所有表數據 exec pr_DataClear -- 截斷日志 backup log LZ的數據庫 with no_log dbcc shrinkdatabase( LZ的數據庫 ) dbcc updateusage( LZ的數據庫 ) -- 查看表空間(概數) select object_name(id) as 表名, (rtrim(8*reserved/1024) + 'MB') as 總量, (rtrim(8*dpages/1024) + 'MB') as 已使用, (rtrim(8*(reserved-dpages)/1024) + 'MB') as 未使用, (rtrim(8*dpages/1024-rows/1024*minlen/1024) + 'MB' ) as 空隙 from sysindexes where indid=1 order by reserved desc
原文出處:http://topic.csdn.net/u/20090816/17/EE0FA21E-8616-4236-A9CB-8C5A3D45C9D9.html 中45樓
?
對于有外鍵約束的表,網上普遍說的方法:
?
EXEC sp_MSForEachTable ' ALTER TABLE ? NOCHECK CONSTRAINT ALL ' -- NOCHECK Const
EXEC sp_MSForEachTable ' truncate TABLE ? '
EXEC sp_MSForEachTable ' ALTER TABLE ? CHECK CONSTRAINT ALL ' -- NOCHECK Constraints是行不通的,因為 trun cate不能對有外鍵的表 ,改為delete from tablename就行,但delete會激活觸發器,這也是一個問題。
轉載于:https://www.cnblogs.com/wqvbjhc/archive/2010/03/06/2465156.html
總結
以上是生活随笔為你收集整理的清空数据库错误:因为该表正由 FOREIGN KEY 约束引用 解决办法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解访问XML节点
- 下一篇: 加速Javascript:DOM操作优化