使用merge语句设置Identity ON

时间:2014-06-06 16:30:42

标签: sql sql-server sql-server-2008

我在表中插入和删除元素,因此,当我想插入一个新元素时,它需要一个新的id号,但是这个id不是最后一个id + 1。例如:最后一个id是5,我插入了5个元素并删除之后,新id将取值11,我需要6.这是我的代码

CREATE TABLE #FC
(
    Code varchar(25),
    Description varchar(50),
    Category varchar(10),
    CreatedDate datetime,
    LastModifiedDate datetime
);

--Adding just one record
INSERT INTO #FC (Code, Description, Category, CreatedDate, LastModifiedDate)
VALUES          ('DELETE_MEMBER', 'Delete Member', 'POLICY', @Now, @Now);
;


SET IDENTITY_INSERT [dbo].[Function_Code] ON;

MERGE
    INTO [dbo].[Function_Code] AS T
    USING #FC AS S
    ON (T.Code = S.Code) AND (T.Description = S.Description) AND(T.Category = S.Category)
    WHEN MATCHED THEN
        UPDATE SET
            [Code] = S.[Code]
            , [Description] = S.Description
            , [Category] = S.Category
            , [CreatedDate] = S.CreatedDate
            , [LastModifiedDate] = S.LastModifiedDate
    WHEN NOT MATCHED THEN
        INSERT (Code, Description, Category, CreatedDate, LastModifiedDate)
        VALUES(S.Code, S.Description, S.Category, S.CreatedDate, S.LastModifiedDate)
;

SET IDENTITY_INSERT [dbo].[Function_Code] OFF;

2 个答案:

答案 0 :(得分:2)

身份是一个您不应该自己处理的技术领域。如果您想自己管理序列,请不要使用身份字段。

尽管如此,如果你真的想这样做,你必须将表重新设置为所需的值:

DELETE YourTable

DECLARE @n INT;
SELECT @n = MAX(YourId) FROM YourTable
DBCC CHECKIDENT ('YourTable', RESEED, @n)

INSERT YourTable

答案 1 :(得分:0)

你问的是危险的。如果您将列设置为标识列,请不要触摸它,让sql server完成其工作。否则,您可以开始获取主键错误。标识列已准备好插入11.您可以通过多次运行在代码中插入6到11,并且下次身份尝试在表中插入行时可能会出现主键错误。

正如托马斯哈拉蒂克所说,你可以重新研究你的餐桌。或者您可以使用:

select MAX(YourId) + 1 FROM YourTable

如果您确定将始终插入已由标识列使用过的ID,请将其插入您的标识列。

但是,如果您通常会覆盖默认身份行为,那么最好自己管理此列,因为从标识列中删除会导致默认情况下出现间隙。