如何使用T-SQL获取主键字段中生成的最后一个值
这是一个SQLServer2005T-SQL问题。我有一个具有整数主键的表,它不是标识列 如何获取生成为唯一主键值的最后一个值,而不管该记录是否随后被删除 想象一下这张桌子:如何使用T-SQL获取主键字段中生成的最后一个值,sql,sql-server,sql-server-2005,tsql,Sql,Sql Server,Sql Server 2005,Tsql,这是一个SQLServer2005T-SQL问题。我有一个具有整数主键的表,它不是标识列 如何获取生成为唯一主键值的最后一个值,而不管该记录是否随后被删除 想象一下这张桌子: TABLE COL_PK VALUE1 VALUE2 1 FDSF RWERWE 2 SDSS £$£$£ 3 FDFSD ))FFFFFF 片刻之后,我删除了记录3 但是,我现在想计算COL_PK列的下一个新值。我无法使用此查询执行此操作: SEL
TABLE
COL_PK VALUE1 VALUE2
1 FDSF RWERWE
2 SDSS £$£$£
3 FDFSD ))FFFFFF
片刻之后,我删除了记录3
但是,我现在想计算COL_PK列的下一个新值。我无法使用此查询执行此操作:
SELECT MAX(COL_PK) + 1 FROM TABLE
…因为这将计算3-这不是下一个PK值。如何获得4-下一个新的Pk值?您需要: a) 将最后生成的数字存储在另一个表中,在每次插入时更新,并在此基础上生成密钥 b) 不要从物理上删除记录,而是在记录上添加某种“已删除”标志,将您的号码保留在表中 c) 只要把它变成一个身份密钥
对于(a),您需要注意“种族”条件,这样您就不会在一个键上尝试插入两次。如果不是身份栏,我认为您不能。。。也许你应该有逻辑删除而不是物理删除,或者有一个单独的表来给你最后分配的值(这是一些保险公司之类的企业的常见做法)。@Tim“…这不是一个标识列…”但是,它确实提出了一个问题:为什么它不是一个标识列?解决这个问题就是标识列存在的原因。对当前值所做的任何检查都是竞争条件。我的建议-使用
IDENTITY
和如上所述的SCOPE\u IDENTITY()
+1:不确定除了使用IDENTITY
列(选项c)之外,为什么还要执行任何操作,然后调用SCOPE\u IDENTITY()
,以查找最后插入的值。