Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.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
Sql 连续序列号作为选择最大值_Sql_Sql Server_Select_Max - Fatal编程技术网

Sql 连续序列号作为选择最大值

Sql 连续序列号作为选择最大值,sql,sql-server,select,max,Sql,Sql Server,Select,Max,这是我的桌子: MyTable(Id、名称、说明、序列号) Id是一个标识字段和主键。 SerialNumber是具有唯一索引的int INSERT INTO MyTable ( Name, Description, SerialNumber ) VALUES ( 'SampleName', 'SampleDesc', ISNULL(MAX(SerialNumber),0) + 1 FROM MyTable) 以这种方式管理序列号的缺点是

这是我的桌子:

MyTable(Id、名称、说明、序列号)

Id是一个标识字段和主键。 SerialNumber是具有唯一索引的int

INSERT INTO MyTable (
    Name, 
    Description, 
    SerialNumber
) VALUES (
    'SampleName', 
    'SampleDesc', 
    ISNULL(MAX(SerialNumber),0) + 1 FROM MyTable)
以这种方式管理序列号的缺点是什么?
什么是并发性?

我认为这样做是为了防止数字上的差异。对于序列和标识,您不能假设永远不会有间隙,尤其是在回滚的情况下


这样做的问题是存在争用条件,并且某些插入可能最终导致错误,或者表可能具有重复的序列号,具体取决于列是否唯一。发生这种情况的原因是,可能有两个进程在将数字插入表之前同时获取最大值。

最大的缺点可能是SQL语法不正确。您可能需要查看序列。如果Id是标识字段和主键,则它必须是唯一的。为什么不使用Id字段作为序列号?这就是问题所在,我不想使用标识作为序列号,因为gapsJamesZ,既然您了解了这个情况,那么您更喜欢用什么方式处理唯一的序列号?我通常有单独的表,其中包含数字,是否可以与其他表共享数字取决于使用频率等。您可以通过更新XXX set@ID=NEXTID,NEXTID=NEXTID+1获取数字,其中TABLENAME='MyTable'。为了防止出现间隙,这必须与insert在同一事务中。我认为,在同一事务中,必须递增NEXTID,并在包含数字的表中更新它。我说的对吗?是的,这就是我之前评论中的update语句试图显示的内容,它是一个update语句,获取数字并更新表以避免死锁