Sql 无法为没有主键的标识列插入显式值

Sql 无法为没有主键的标识列插入显式值,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一张桌子: Ratings --- PersonId int FKEY FormId int FKEY Rating int (NULLABLE) 执行此查询时: INSERT INTO Ratings (PersonId, FormId) SELECT p.PersonId, f.FormId FROM People p, Forms f 我得到这个错误: 当identity_insert设置为OFF时,无法在表“Ratings”中为identity列插入显式值 有一次,我意外地将两个

我有一张桌子:

Ratings
---
PersonId int FKEY
FormId int FKEY
Rating int (NULLABLE)
执行此查询时:

INSERT INTO Ratings (PersonId, FormId)
SELECT p.PersonId, f.FormId
FROM People p, Forms f
我得到这个错误:

当identity_insert设置为OFF时,无法在表“Ratings”中为identity列插入显式值


有一次,我意外地将两个外键列设置为复合主键,我担心可能存在某种形式的数据损坏。从长远来看,我可以做些什么来补救或修复我的问题?

此脚本演示了
IDENTITY\u INSERT
的工作原理。请检查-没有定义
主键

CREATE TABLE dbo.Tool(ID INT IDENTITY, Name VARCHAR(40)) 
GO

SELECT * FROM dbo.Tool 
GO

SET IDENTITY_INSERT dbo.Tool ON 
GO

INSERT INTO dbo.Tool (ID, Name) VALUES (3, 'Garden shovel') 
GO

SELECT * FROM dbo.Tool 
GO

DROP TABLE dbo.Tool
GO

请修改您的评分表结构。其中一列PersonId或FormId被配置为标识列(序列),这没有意义,因为两者都是指向其他表的FK。您应该从此表中的列(PersonId或FormId)中删除IDENTITY属性。

尝试将IDENTITY\u INSERT设置为ON

SET IDENTITY_INSERT  [Table] ON
--Write your Insert  Query
SET IDENTITY_INSERT  [Table] OFF

如错误消息所示,如果要显式设置值,则需要将
IDENTITY\u INSERT
设置为
ON
。我知道,但我不应该这样做,因为没有主键,我也对其他表进行了类似的查询。顺便说一句,我不确定为什么要批量插入没有任何值的评级记录(甚至允许
null
评级)-您可以简单地使用他们在此表中没有记录这一事实来记录这种状态。该表的名称很糟糕,但必须保持人员和表单之间的关系,即使该人员从未对该表单进行过评级。大规模插入实际上只在一个小的现有用户网络中进行,该网络将对所有表单的访问。我100%确定该表没有主键。对于没有主键的表,IDENTITY\u INSERT属性是否默认设置为true?不,没有此类默认行为-您需要明确地将IDENTITY\u INSERT设置为,这样看起来似乎存在数据损坏问题。是否有办法通过以下方式解决此问题SQL Server?我的原始帖子中的内容基本上是它:只是一个表,其中包含两个外键列,但在某一点上意外地成为复合主键。我已经删除了该表,但我可以创建一个同名的新表,看看它是否仍然存在这些问题。第一次这样做并没有解决问题。我甚至无法创建一个新表w表使用此表名,因为它认为旧表仍然存在(在management studio中不可见)。我将重新启动数据库服务器,看看这是否修复了任何问题。我曾在某一点上意外地使用它们创建了一个复合键。我早就删除了它,但其影响仍在继续。SQL server未检测到主键(或任何键,因为我擦除了所有内容),但限制仍在继续。我只是删除了表,并使用相同的配置创建了一个新表(因为使用相同的表名创建相同的架构并不能解决问题)@jokulmorder列是否为标识列与它是否是任何键的一部分无关。因此,删除键不会将列更改为不再是标识列。我知道,但我没有将标识规范设置为true。我知道您确信这只是一个配置问题,但删除表确实存在不允许我用该名称重新创建一个新表。这就是为什么我认为这是SQL Management Studio的一个问题。我所在的连接不是很好,因此我不太反对排除服务器和客户端之间的数据损坏。@jokulmorder(澄清一下,我不是发布此答案的人。)当然,SSMS有一个bug是可以想象的,在这个bug中,删除表失败了,但是由于某种原因并不会导致显示正确的错误消息。要排除这些问题,您可以避免使用表设计器(甚至完全避免使用SSMS)并使用适当的SQL语句删除并重新创建表。如果愿意,您可以使用SSMS为您生成脚本,并在SSMS之外执行。对于任何尖锐的语气,我深表歉意;这只是一个非常令人沮丧的问题。我将继续尝试使用脚本和查询。我通过创建创建一个表并将其重命名为已删除的表,但删除该表似乎无法解决问题。