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


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

    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楼

     http://blog.csdn.net/nuptsv_ice/article/details/17996151

    对于有外键约束的表,网上普遍说的方法:

    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会激活触发器,这也是一个问题。
  • 相关阅读:
    我眼中的SCRUM
    文本转换程序
    免费接口
    看板,敏捷的另一种实现方式
    Android Asynchronous Http Client-Android异步网络请求客户端接口
    hdu4753 Fishhead’s Little Game 状态压缩,总和一定的博弈
    dbcp、c3p0、jdbc常用连接配置
    IE安全分析
    redis入侵小结
    heartbleed漏洞利用
  • 原文地址:https://www.cnblogs.com/hedianzhan/p/8409305.html
Copyright © 2020-2023  润新知