SQL Server数据库中的自动递增计数器

时间:2014-02-18 08:38:04

标签: sql sql-server

我是SQL Server的新手,我使用过MySQL(基本开发)。现在我想在我的SQL Server中创建一个表,它自动增量/ -decrement取决于行的添加和删除。

为了创建一个表,我发现了这个。例如,我创建了我的数据库,但它没有那么好用。

CREATE TABLE Persons
(
   ID int IDENTITY(1,1) PRIMARY KEY,
   LastName varchar(255) NOT NULL,
   FirstName varchar(255),
   Address varchar(255),
   City varchar(255)
)

当我删除任何行时,我的ID应该从2-1 or 6-5 or 7-6开始递减。有时它会自动从7-9 or 6-9递增。它并不完美。

所以任何人都可以告诉我如何解决这个问题,我几乎已经尝试了24小时,最终没有结果。

请帮助解决此问题。

4 个答案:

答案 0 :(得分:1)

表演会很糟糕 - 并且会触发。 1行删除可以变成1亿行更新,然后是10亿行级联更新。这是一个可怕的设计。

这就是NO数据库支持的原因(包括MySQL)。

当用完时,身份证被起诉,主要密钥永远不会随意改变。假设您有一百万行并删除ro2 nr 2 - 即999997更新,然后更新在外键约束中使用该行的所有行。

答案 1 :(得分:0)

据我所知,SQL Server没有一种机制可以在删除某些行后自动更新IDENTITY列。我认为这种机制也会使性能变差,因此不会执行此类任务。

我想到的第一个简单任务是trigger,听取行的删除。删除完成后,触发器将相应地更新IDENTITY列。但是,您必须了解SQL Server实例的性能会非常糟糕,例如考虑更新100万行。

答案 2 :(得分:0)

标识属性会在删除行时导致列值出现间隙。即使正在进行插入并且插入失败,标识列值也会增加并且不会回滚。

如果你真的想要连续的值,你应该保留一个包含当前最大值的单独表格,并在插入和删除行时更新它。

您可以创建一个存储过程来实现自定义排序逻辑,其中包含单个行和列的表根据传递给存储过程的参数进行更新,该参数指示是否正在执行插入或删除。 See here for more

答案 3 :(得分:-1)

在SQL Server中,删除记录时IDENTITY列值不会减少。这就是它的工作原理。这对IDENTITY列施加约束是线程安全的。

所以我认为在你的情况下,让IDENTITY列保持不变。如果您希望序列号与基于主键的行相关联,则可以在从表中执行SELECT时使用ROW_NUMBER(),如下所示:

SELECT ROW_NUMBER() OVER(ORDER BY ID) as rn, * FROM your_table