各位大侠:
    本人用SQL2000也有些年头了,在使用过程中经常遇到一些奇怪的问题,不知道大家有没有碰到过这样的问题,有请各路高手前来会诊,分析一下是什么情况,先谢过大家了。
    
    问题如下:
    (1).Identity字段不再增长
        一个表中有个流水号字段,这个字段被设计成int和Identity,有的客户用了一段时间后,这个字段就不再增长了,因为有些表会用这个列做主键,所以不增长时再插入新数据就会出现主键重复。这时只能把这个列先改成非Identity列,然后再改回去就可以了。
    (2).主键重复
        比如有表table1(column1,column2,column3,column4),其中column1和column2是主键,有时就会出现表中有两条一样的column1和column2,但直接用select column1,column2 from table1 group by column1,column2 having count(*) > 1是查不出数据的,用dbcc checktable(table1)时会报错,dbcc dbreinde(table1)会报唯一索引上有重复的键值。这时只能这样解决,先select * into tmp from table1,再truncate table table1,然后再用select column1,column2 from tmp grouup by column1,column2 having count(*) > 1 查出重复的数据,这个时候就可以查重复的数量,最后再过滤这些重复的数据插回table1表就可以了    

解决方案 »

  1.   

    回复feixianxxx,不可能是因空格导致的
      

  2.   

    对于自增列的问题, 首先你要确定是不增长, 还是增长的值导致了主键重复
    对于前者, 你用 DBCC 检查一下数据库和表有没有问题, 并且生成对象的脚本, 看看有没有什么特别的对于后者, 很有可能是使用 DBCC CHECKIDENT 重新设置了标识列增长的起始值导致, 例如下面的示例
    USE tempdb;
    GOCREATE TABLE dbo.tb(
    id int IDENTITY(1, 1),
    value int
    );
    INSERT dbo.tb VALUES(1);
    INSERT dbo.tb VALUES(2);
    GODBCC CHECKIDENT(N'dbo.tb', RESEED, 0);
    INSERT dbo.tb VALUES(3);
    GOSELECT * FROM dbo.tb;
    GODROP TABLE dbo.tb
      

  3.   

    DBCC CHECKIDENT(N'dbo.tb', RESEED, 0);
    INSERT dbo.tb VALUES(3);
    又学一招
      

  4.   

    任何软件都存在BUG,不过关于MSSQL的,暂时没有发现
      

  5.   


    回邹老大:
        我认为是不增长导致的重复,因为可以确定没有使用过DBCC CHECKIDENT,而且出现这种情况时,大多数是所有identity列都不增长,而不是只有一个表,而且出现这种情况时,也不是每次dbcc都会报错。第二种情况dbcc table时是一定会有错误的。想了解具体是因为什么原因导致的,有没有避免的方法?