Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用T-SQL获取主键字段中生成的最后一个值_Sql_Sql Server_Sql Server 2005_Tsql - Fatal编程技术网

如何使用T-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

这是一个SQLServer2005T-SQL问题。我有一个具有整数主键的表,它不是标识列

如何获取生成为唯一主键值的最后一个值,而不管该记录是否随后被删除

想象一下这张桌子:

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()
,以查找最后插入的值。