如何选择使用 IDENTITY_INSERT 或在单个语句中提供一个
How to choose to use IDENTITY_INSERT or provide one in a single statement
我正在处理一个存储过程,它需要在 table 中重新插入带有标识列的元素。这样做,对于某些行,它需要指定标识列,对于其他一些行,最好由标识列生成新的标识值。是否可以在单个语句而不是 IF-ELSE
中执行此操作?
这是我目前的解决方案(其中 id_column
是身份列):
DECLARE @id_to_insert INT, @val1 INT, @val2 INT, @val3 INT, @val4 INT;
-- Do some things
IF @id_to_insert IS NOT NULL
BEGIN
SET IDENTITY_INSERT dbo.table1 ON;
INSERT INTO dbo.table1 (id_column, col1, col2, col3, col4, col4)
VALUES (@id_to_insert, @val1, @val2, @val3, @val4);
SET IDENTITY_INSERT dbo.table1 OFF;
END
ELSE
BEGIN
INSERT INTO dbo.table1 (col1, col2, col3, col4, col4)
VALUES (@val1, @val2, @val3, @val4);
END
如您所见,这两个语句非常相似,不必重复几乎相同的插入会很有趣。
编辑:
此 table 包含当前联系人数据。我将 archived/deleted 联系人移至另一个 table,以便我们保持此 table 干净且没有不需要的数据,但有时我可能会将它们恢复为当前数据 table。如果可能的话,我想保留联系人在 archived/deleted 之前的身份。如果不可能(身份已经重新分配)我需要生成一个新的。
你能做的最接近的事情是像这样的伪代码:
IF @id_to_insert IS NULL
SET @id_to_insert = SELECT [the next identity value] FROM MyTable;
SET IDENTITY_INSERT dbo.table1 ON;
INSERT INTO dbo.table1 (id_column, col1, col2, col3, col4, col4)
VALUES (@id_to_insert, @val1, @val2, @val3, @val4);
SET IDENTITY_INSERT dbo.table1 OFF;
而且您可能需要使用事务来处理并发问题。
我强烈建议不要在日常使用中使用身份插入。 Identity insert 要求用户拥有 table 或对 table 具有更改权限,这对于一般用户来说不是一个好主意。身份插入功能的存在是为了允许数据迁移,并且通常只应在维护类型的模式中使用,而不是应该经常发生的事情。
您能否在 table 中添加一个 ActiveFlag
字段?然后,您可以在 (ActiveFlag, id_column)
上创建聚簇索引。这将使您受益于分离数据以便快速访问新旧数据。当 table 过期或恢复活力时,您也不会有在 table 之间来回移动数据的所有开销;这只是对标志的字段更新。保持两个独立的 tables 似乎增加了更多的工作却几乎没有好处。
我正在处理一个存储过程,它需要在 table 中重新插入带有标识列的元素。这样做,对于某些行,它需要指定标识列,对于其他一些行,最好由标识列生成新的标识值。是否可以在单个语句而不是 IF-ELSE
中执行此操作?
这是我目前的解决方案(其中 id_column
是身份列):
DECLARE @id_to_insert INT, @val1 INT, @val2 INT, @val3 INT, @val4 INT;
-- Do some things
IF @id_to_insert IS NOT NULL
BEGIN
SET IDENTITY_INSERT dbo.table1 ON;
INSERT INTO dbo.table1 (id_column, col1, col2, col3, col4, col4)
VALUES (@id_to_insert, @val1, @val2, @val3, @val4);
SET IDENTITY_INSERT dbo.table1 OFF;
END
ELSE
BEGIN
INSERT INTO dbo.table1 (col1, col2, col3, col4, col4)
VALUES (@val1, @val2, @val3, @val4);
END
如您所见,这两个语句非常相似,不必重复几乎相同的插入会很有趣。
编辑:
此 table 包含当前联系人数据。我将 archived/deleted 联系人移至另一个 table,以便我们保持此 table 干净且没有不需要的数据,但有时我可能会将它们恢复为当前数据 table。如果可能的话,我想保留联系人在 archived/deleted 之前的身份。如果不可能(身份已经重新分配)我需要生成一个新的。
你能做的最接近的事情是像这样的伪代码:
IF @id_to_insert IS NULL
SET @id_to_insert = SELECT [the next identity value] FROM MyTable;
SET IDENTITY_INSERT dbo.table1 ON;
INSERT INTO dbo.table1 (id_column, col1, col2, col3, col4, col4)
VALUES (@id_to_insert, @val1, @val2, @val3, @val4);
SET IDENTITY_INSERT dbo.table1 OFF;
而且您可能需要使用事务来处理并发问题。
我强烈建议不要在日常使用中使用身份插入。 Identity insert 要求用户拥有 table 或对 table 具有更改权限,这对于一般用户来说不是一个好主意。身份插入功能的存在是为了允许数据迁移,并且通常只应在维护类型的模式中使用,而不是应该经常发生的事情。
您能否在 table 中添加一个 ActiveFlag
字段?然后,您可以在 (ActiveFlag, id_column)
上创建聚簇索引。这将使您受益于分离数据以便快速访问新旧数据。当 table 过期或恢复活力时,您也不会有在 table 之间来回移动数据的所有开销;这只是对标志的字段更新。保持两个独立的 tables 似乎增加了更多的工作却几乎没有好处。