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

来源:互联网 发布:ocr图像识别软件 编辑:程序博客网 时间:2024/05/03 06:24
如下解决了五个问题 
1. 清空数据 
2. 有外键也可以, 因为是逆向删除, 从最后一张表删除. 且使用的是delete, 因为truncate不能对有外键的表 
3. 种子问题, 如果表存在种子重设为0, 如不存在就不操作 
4. 加了事务, 中间报错, 有后悔机会 

5. 截断日志功能, 因为使用delete, 删除后日志文件会增大, 可以不使用

if( object_id('pr_DataClear') is not null )    drop procedure pr_DataCleargocreate procedure pr_DataClearasbegin 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_Clearcommitgo-- 清空所有表数据exec pr_DataClear-- 截断日志backup log LZ的数据库 with no_logdbcc 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 '  --清空数据 truncate   table   表名  --启用外键约束 exec   sp_msforeachtable   'alter   table   ?   check   constraint   all '

是行不通的,因为truncate不能对有外键的表 ,改为delete from tablename就行,但delete会激活触发器,这也是一个问题。

http://blog.csdn.net/wqvbjhc/article/details/5351562

原创粉丝点击