主键增量无法正确增加,怪

xcz1943 2005-05-26 09:20:20
我在sql设计了一个表,主键KEYID,int,标识增量1
1,2,3,4,5,6行
当我删除第6行时,再添加一行,KEYID变成了7
没有了第6行,这是为什么呢?怎么解决?
...全文
123 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
CentaurCao 2005-05-27
  • 打赏
  • 举报
回复
那就每次插入数值之前先强行纠正identity的数值
首先select count(*) 得到现在表中的行数x,
然后dbcc checkident (表名, reseed, x)

不过感觉这样做不大好……
:(
GRLD8888 2005-05-27
  • 打赏
  • 举报
回复
因为DELETE在删除记录时,
以物理方式一次删除一行,并在事务日志中记录每个删除的行。
这样的话,当你删除含有标识列的记录时,事务日志中已经记录了这个删除的行
此时你在向存在标识列的表中插入记录时,就出现标识列不一致的情况。
如要你想解决这个不一致的现象,可以这样做:
SET IDENTITY_INSERT table1 ON
insert into table1(id,amount) values(6,545)
set inentity_insert table1 off
这样就可以啦
建议,如果频繁删除这个表中的记录时,不建议在此表使用标识列

xcz1943 2005-05-27
  • 打赏
  • 举报
回复
用dbcc checkident 好像很麻烦 ,有没有简单点的方法
天地客人 2005-05-27
  • 打赏
  • 举报
回复
同意楼上说的
xcz1943 2005-05-26
  • 打赏
  • 举报
回复
他在vb.net中怎么执行呢
能不能写点代码?
duanduan1122 2005-05-26
  • 打赏
  • 举报
回复
SET IDENTITY_INSERT
允许将显式值插入表的标识列中。

语法
SET IDENTITY_INSERT [ database.[ owner.] ] { table } { ON | OFF }

参数
database

是指定的表所驻留的数据库名称。

owner

是表所有者的名称。

table

是含有标识列的表名。

注释
任何时候,会话中只有一个表的 IDENTITY_INSERT 属性可以设置为 ON。如果某个表已将此属性设置为 ON,并且为另一个表发出了 SET IDENTITY_INSERT ON 语句,则 Microsoft® SQL Server™ 返回一个错误信息,指出 SET IDENTITY_INSERT 已设置为 ON 并报告此属性已设置为 ON 的表。

如果插入值大于表的当前标识值,则 SQL Server 自动将新插入值作为当前标识值使用。

SET IDENTITY_INSERT 的设置是在执行或运行时设置,而不是在分析时设置。


示例
下例创建一个含有标识列的表,并显示如何使用 SET IDENTITY_INSERT 设置填充由 DELETE 语句导致的标识值中的空隙。

-- Create products table.
CREATE TABLE products (id int IDENTITY PRIMARY KEY, product varchar(40))
GO
-- Inserting values into products table.
INSERT INTO products (product) VALUES ('screwdriver')
INSERT INTO products (product) VALUES ('hammer')
INSERT INTO products (product) VALUES ('saw')
INSERT INTO products (product) VALUES ('shovel')
GO

-- Create a gap in the identity values.
DELETE products
WHERE product = 'saw'
GO

SELECT *
FROM products
GO

-- Attempt to insert an explicit ID value of 3;
-- should return a warning.
INSERT INTO products (id, product) VALUES(3, 'garden shovel')
GO
-- SET IDENTITY_INSERT to ON.
SET IDENTITY_INSERT products ON
GO

-- Attempt to insert an explicit ID value of 3
INSERT INTO products (id, product) VALUES(3, 'garden shovel').
GO

SELECT *
FROM products
GO
-- Drop products table.
DROP TABLE products
GO


duanduan1122 2005-05-26
  • 打赏
  • 举报
回复
这样来做:
1。SET IDENTITY_INSERT on
2。insert yourtable
values(6,'其他列') --这时候,你就可以将6插入进去。
3。SET IDENTITY_INSERT off

duanduan1122 2005-05-26
  • 打赏
  • 举报
回复
当然没有了,因为你设置了标识列呀。
它只会不断的往上增长,不管你是不是删除以前的数据。

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧