各位大侠:
本人用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表就可以了
本人用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表就可以了
解决方案 »
- insert 的内容是select 出来的 + 自己设定的,怎么写?
- 如何更新一个表的列的顺序
- 这样的case语句能否用if。。。else替换??
- 一个从Excel导入的代码,放到存储过程中出现 ANSI_NULLS and ANSI_WARNINGS options (####100分####)
- ~~~!!!比较难的SQL!!!~~~
- distinct不行,说是有表image字段,但是我不能去掉,还必需要这个image怎么办?
- 表设计中公式如何写?
- SQL Mail 的疑问
- 这是个很严谨的问题,好象数学公式的推导一样,请高手解答
- 大力请进!
- 在删除数据库记录的同时,再写入数据库会有问题吗?
- sql 2000 数值怎么转换为ip
对于前者, 你用 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
INSERT dbo.tb VALUES(3);
又学一招
回邹老大:
我认为是不增长导致的重复,因为可以确定没有使用过DBCC CHECKIDENT,而且出现这种情况时,大多数是所有identity列都不增长,而不是只有一个表,而且出现这种情况时,也不是每次dbcc都会报错。第二种情况dbcc table时是一定会有错误的。想了解具体是因为什么原因导致的,有没有避免的方法?