我是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小时,最终没有结果。
请帮助解决此问题。
答案 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