SQL Server 错误:“无法为标识列插入显式值”,即使我 SET IDENTITY_INSERT ON
Posted
技术标签:
【中文标题】SQL Server 错误:“无法为标识列插入显式值”,即使我 SET IDENTITY_INSERT ON【英文标题】:SQL Server error: "Cannot insert explicit value for identity column" even when I SET IDENTITY_INSERT ON 【发布时间】:2018-05-05 14:51:43 【问题描述】:我真的复习了好几次,这就是我问的原因;求指导……
我有一张桌子,如下面的脚本。然后,我设置IDENTITY_INSERT ON
。然后我尝试进行插入选择,(我需要相同的 id)
我不断收到此错误:
消息 544,第 16 级,状态 1,第 2 行 当 IDENTITY_INSERT 设置为 OFF 时,无法为表“Table1”中的标识列插入显式值。
有人知道为什么吗?数据库级别的任何设置都可以否决IDENTITY_INSERT ON
?
感谢任何建议。提前致谢和亲切的问候。
脚本到表格:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].Table1
(
[TableId] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](256) NOT NULL,
[RowVersion] [timestamp] NOT NULL,
[AddedDate] [datetime2](7) NOT NULL,
[stuff2] [int] NOT NULL,
[ModifiedDate] [datetime2](7) NOT NULL,
[LastModifiedBy] [int] NOT NULL,
CONSTRAINT [Table1_PK]
PRIMARY KEY CLUSTERED ([TableId] ASC)
) ON [PRIMARY]
GO
插入语句:
SET IDENTITY_INSERT [dbo].Table1 ON;
INSERT INTO [dbo].Table1 ([TableId], [Name], [AddedDate], [stuff2], [ModifiedDate], [LastModifiedBy])
SELECT
[RoleID], [Name], [AddedDate], [stuff2], [ModifiedDate], [LastModifiedBy]
FROM
[dbo].Table2
【问题讨论】:
这与IDENTITY INSERT
无关,而是与 PRIMARY KEY
约束有关,因为您尝试插入相同的 ID 1 次或多次。
@Sami。真的吗?我之前插入了pk。但是,我会尝试删除PK并重试。感谢您的评论。:D
另外不要剪掉错误信息,请Msg 544, Level 16, State 1, Line 2
不是完整的错误信息,请编辑问题并添加你的完整错误信息。
消息 544,级别 16,状态 1,第 2 行当 IDENTITY_INSERT 设置为 OFF 时,无法在表 'Table1' 中插入标识列的显式值。谢谢先生,您的帮助。
哦!那是因为我稍微修改了一下,没有给出真正的数据库结构。
【参考方案1】:
即使我在我的桌子上运行了SET IDENTITY_INSERT mytable ON
命令,我也遇到了同样的错误。我意识到这是因为我正在关闭查询脚本中的行。
如果您用;
关闭每一行,则SET IDENTITY_INSERT mytable ON
命令将不适用于以下行。
即 像
这样的查询SET IDENTITY_INSERT mytable ON;
INSERT INTO mytable (VoucherID, name) VALUES (1, 'Cole');
给出错误Cannot insert explicit value for identity column in table 'mytable' when IDENTITY_INSERT is set to OFF.
但是这样的查询会起作用:
SET IDENTITY_INSERT mytable ON
INSERT INTO mytable (VoucherID, name) VALUES (1, 'Cole')
SET IDENTITY_INSERT mytable OFF;
似乎SET IDENTITY_INSERT
命令只对事务有效,而;
将表示事务结束。
【讨论】:
【参考方案2】:非常感谢@Sami,您帮助我实现了正确的道路。 事实证明,您可以一次只对一个表使用 IDENTITY_INSERT(出于显而易见的原因,我不经常这样做)。 当我一次为几个表做时,我看到了错误,但是由于表的名称相似,我认为它抛出了一个错误,因为我之前在同一个表上运行了 Identity_insert,但这是因为它被另一张桌子。 直到我一一查看错误消息时才意识到。 :P :D
https://dba.stackexchange.com/questions/12650/why-is-identity-insert-on-only-allowed-on-one-table-at-a-time
【讨论】:
这就是为什么您应该始终在完成时将SET IDENTITY_INSERT
改为OFF
。
这是真的! :D
select 'set identity_insert ['+s.name+'].['+o.name+'] off' from sys.objects o inner join sys.schemas s off s.schema_id=o.schema_id where o.[type]='U' and exists(select 1 from sys.columns where object_id=o.object_id and is_identity=1)
即使你解决了这个问题,你也需要放弃你的PK,否则会抛出错误Violation of PRIMARY KEY constraint 'Table1_PK'. Cannot insert duplicate key in object 'dbo.Table1'
。
如果你插入了错误的数据。否则,如果信息一致,则不需要。 :D【参考方案3】:
我遇到了同样的错误,然后我发现我插入了一个显式值,而我的 PK 设置为 Is Identity = true,而我的关系是 1:1..0,这意味着我的子表使用父表的 PK。 [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
仅在 Is Identity = true 并且您的表中没有冲突时才有效。
【讨论】:
以上是关于SQL Server 错误:“无法为标识列插入显式值”,即使我 SET IDENTITY_INSERT ON的主要内容,如果未能解决你的问题,请参考以下文章