清空数据库错误:因为该表正由 FOREIGN KEY 约束引用 解决办法

来源:互联网 发布:叮当猫网络什么意思 编辑:程序博客网 时间:2024/05/08 13:55

如下解决了五个问题 
1. 清空数据 
2. 有外键也可以, 因为是逆向删除, 从最后一张表删除. 且使用的是delete, 因为truncate不能对有外键的表 
3. 种子问题, 如果表存在种子重设为0, 如不存在就不操作 
4. 加了事务, 中间报错, 有后悔机会 
5. 截断日志功能, 因为使用delete, 删除后日志文件会增大, 可以不使用

[cpp] view plaincopy
  1. if( object_id('pr_DataClear') is not null )  
  2.     drop procedure pr_DataClear  
  3. go  
  4. create procedure pr_DataClear  
  5. as  
  6. begin transaction  
  7.     declare @cTblName varchar(128)  
  8.     declare cur_Clear cursor for select rtrim(name) from sysobjects where type = 'U' order by crdate desc  
  9.     open cur_Clear  
  10.     declare @cSQL varchar(255)  
  11.     fetch next from cur_Clear into @cTblName  
  12.     while( @@fetch_status = 0)  
  13.     begin  
  14.         set @cSQL = 'delete from ' + @cTblName  
  15.         print @cSQL  
  16.         exec( @cSQL )  
  17.         if( ident_seed(@cTblName) is not null )  
  18.         begin  
  19.             dbcc checkident( @cTblName, reseed, 0 )  
  20.             print '有种子且成功重置为1'  
  21.         end  
  22.         fetch next from cur_Clear into @cTblName  
  23.     end  
  24.     close cur_Clear  
  25.     deallocate cur_Clear  
  26. commit  
  27. go  
  28. -- 清空所有表数据  
  29. exec pr_DataClear  
  30. -- 截断日志  
  31. backup log LZ的数据库 with no_log  
  32. dbcc shrinkdatabase( LZ的数据库 )  
  33. dbcc updateusage( LZ的数据库 )  
  34. -- 查看表空间(概数)  
  35. select object_name(id) as 表名, (rtrim(8*reserved/1024) + 'MB') as 总量, (rtrim(8*dpages/1024) + 'MB') as 已使用,  
  36.     (rtrim(8*(reserved-dpages)/1024) + 'MB') as 未使用, (rtrim(8*dpages/1024-rows/1024*minlen/1024) + 'MB' ) as 空隙  
  37.     from sysindexes  
  38.     where indid=1  
  39.     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是行不通的,因为truncate不能对有外键的表 ,改为delete from tablename就行,但delete会激活触发器,这也是一个问题。
0 1
原创粉丝点击