SQL identity属性

存储过程执行成功与否,均会对定义identity属性的字段加1,这样会造成字段号的断裂。有什么解决办法没?

SQL SERVER数据库引擎不保证IDENTITY标识列的连续性和唯一性,
不连续的可能出现情况:
1.事务回滚;2.删除记录;3.DBCC CHECKIDENT重置标识都可能造成IDENTITY列的不连续;
不唯一的可能出现情况:
1.强制插入标识列;2.DBCC CHECKIDENT重置标识 可能造成IDENTITY列的不唯一;
要保证唯一性 可以把该列定义为主键或则给其唯一约束;
要保证连续性,感觉比较麻烦,你这边是事务回滚造成的不连续,那么可以在失败的时候获取当前当前COUNT(*)把它作为IDENTITY的值?
手动插入标识列?
SET IDENTITY_INSERT 表名 ON --允许插入标识值的选项
INSERT #(ID)VALUES(xx)
SET IDENTITY_INSERT 表名 OFF
---
删除其中某些数据,还想让ID实时更新有办法么?
其实能保证IDENTITY唯一性就OK了 不需要连续,int 4个字节32位还怕不够用么?
你以后若想要获取连续的行数ROW_NUMBER函数即可实现。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-10-24
这个要看看你存储过程是怎么写的。一般情况下,只有执行成功了,identity标识列才会自动加1,估计是你的存储过程有点问题追问

CREATE PROCEDURE [dbo].[AddMI]
@MachineNum nvarchar(20) ,@MachineName nvarchar(50) AS
BEGIN
BEGIN TRANSACTION
INSERT INTO MI(MachineNum,MachineName,MachineDes)
VALUES (@MachineNum,@MachineName,@MachineDes)
IF @@ERROR0
BEGIN
ROLLBACK TRANSACTION
END
ELSE
COMMIT TRANSACTION
END
ELSE
假如就这个,我给MI表中的ID字段定义了identity属性。你帮忙看看

追答

恩,存储过程没有错。
那程序那边有木有判断执行成功?

追问

不管执行成功与否,那个字段都加1

追答

改成sql语句进行insert,也会这样吗?

追问

对啊,不管我如何添加。比如当前ID字段为3,我执行一次错误的存储过程,在执行一次正确的存储过程。此时ID字段直接是5,而缺少4。这是为什么?

追答

恩,你检查一下,你的Id标识列,标示种子是不是从1开始,标示增量是不是每次增长1

追问

[MConID] [int] IDENTITY(1,1) NOT NULL
插入的我解决了,那如果删除其中某些数据,还想让ID实时更新有办法么?

追答

你的意思是说删除的时候,让id自动变少吗?
比如删除id号为9的,那么后面的id号为10的自动变成9。是这样的吗?

追问

追答

这样啊,那IDENTITY其实就不是一个标识列了,它是代表一个序号。
恩,那你就可以在新增,删除的时候。将 Row_Number() over(order by 列名) as rowidx这个得到的就是序号,插入id列

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网