sql - 在两个记录之间插入

时间:2014-05-20 14:09:59

标签: sql sql-server

记录是我数据库中的一个表,“代码”是主键。

代码 - > 1000-1001-1002-1003-1004 ...

如果1002删除1000-1001-1003-1004

如果有新记录搜索'Code'并找到pos,例如 1000-1001-1003-1004和新记录主键1002

但两个记录主键之间的位置不是1005

我该怎么做?

4 个答案:

答案 0 :(得分:1)

在极少数情况下我需要插入一个与IDENTITY相反的值,我会这样做:

SET IDENTITY_INSERT dbo.[Table] ON  --Allow insert of specific ID values
INSERT INTO dbo.[Table] ...
SET IDENTITY_INSERT dbo.[Table] OFF --Revert to auto-generated ID values

答案 1 :(得分:0)

Code主键列也是一个标识列,每次插入新记录时都会自动增加。你应该保持原样。不要重复使用主键,因为它可能会影响数据库的完整性。如果可能,请尝试不删除记录,您可以向表中添加一列,通过将每个记录标记为活动或非活动来跟踪每个记录的状态。

答案 2 :(得分:0)

显然,您使用自然键作为表格的主键。这没关系,当然你可以删除这样的记录,然后重新使用那个密钥。一个例子是员工表,其中密钥是可能在某个时间重新使用的员工编号。

仅使用SQL Server的自动增量功能,您可以对基于ID的表执行此功能,但不能使用自然键。

在SQL Server中,这种类型的自动增量列称为IDENTITY。删除该属性并关心管理密钥代码。

答案 3 :(得分:0)

使用IDENTITY - 列时,您不能简单地在记录之间插入记录,IDENTITY表示数据库的值会自动生成。

但是,我解释你的问题不是关于插入新记录,而是如果你删除了一个结果集中的行的索引,如果你删除了该行中的一行,那么现在该行被分段后面的ID。

好吧,正如评论和其他答案所指出的那样,重复使用主键通常是一个坏主意,你应该让你的逻辑尽可能与键的值无关。

那说,当然如果你有一个具有数字类型的主键,那么按顺序排序在很多情况下都是有意义的,但是如果你想在不使用索引的情况下告诉集合中一行的位置我建议您使用ROW_NUMBER()

这是一个simple sample声明一个表,删除一行并仍然显示该集合中每行的正确索引(行号),而不重置或重用主键:

DECLARE @RowOrderTest TABLE (ID INT PRIMARY KEY IDENTITY(1,1), Value NVARCHAR(15));

INSERT INTO @RowOrderTest (Value)
    SELECT 'dummy'
    UNION ALL
    SELECT 'dummy'
    UNION ALL
    SELECT 'dummy'
    UNION ALL
    SELECT 'dummy'
    UNION ALL
    SELECT 'dummy'
    UNION ALL
    SELECT 'dummy'
    UNION ALL
    SELECT 'dummy'
    UNION ALL
    SELECT 'dummy'

DELETE @RowOrderTest WHERE ID = 5

SELECT ID, Value, ROW_NUMBER() OVER (ORDER BY ID) FROM @RowOrderTest

如果您确实需要插入一个带有(预先)已知键值的行,请不要使用IDENTITY - 列,或者使用SET IDENTITY_INSERT dbo.[Table] ON之前关闭自动行为{{1行插入后