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

本文介绍了数据库清空数据的方法,包括禁用外键、逆向删除、种子问题解决、事务回滚及日志管理。重点突出如何高效、安全地清空数据库表,并在清空后重置种子值,确保数据一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如下解决了五个问题 
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.youkuaiyun.com/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.youkuaiyun.com/wqvbjhc/article/details/5351562

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值