Sql server 空表插入[sql server]时引发的唯一约束异常

Sql server 空表插入[sql server]时引发的唯一约束异常,sql-server,Sql Server,我的INSERT语句在尝试将新记录添加到空表(属性)时失败(还没有记录)。 我对系统引发的错误感到惊讶: 违反了唯一密钥约束“CK\u Attribute\u Name\u IDproject”。无法在对象“dbo.Attribute”中插入重复的键。重复的键值为(dummy,55) 此表的创建脚本如下所示 CREATE TABLE [dbo].[Attribute]( [ID] [int] IDENTITY(1,1) NOT NULL, [IDproject] [int] NO

我的INSERT语句在尝试将新记录添加到空表(属性)时失败(还没有记录)。 我对系统引发的错误感到惊讶:

违反了唯一密钥约束“CK\u Attribute\u Name\u IDproject”。无法在对象“dbo.Attribute”中插入重复的键。重复的键值为(dummy,55)

此表的创建脚本如下所示

CREATE TABLE [dbo].[Attribute](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [IDproject] [int] NOT NULL,
    [IDtype] [int] NOT NULL,
    [IDgroup] [int] NOT NULL,
    [name] [varchar](50) NOT NULL,
    [color] [int] NULL,
    [protected] [tinyint] NULL,
    [datemodified] [datetime] NOT NULL,
PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],
 CONSTRAINT [CK_Attribute_Name_IDproject] UNIQUE NONCLUSTERED 
(
    [name] ASC,
    [IDproject] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
我跳过了外键引用和默认值,这在本文中似乎不感兴趣。 唯一约束适用于[name]和[IDproject]

运行以下语句时

SELECT *
  FROM [dbo].[Attribute]
GO
SELECT *
  FROM [dbo].[Project]
GO
我得到了结果

(受影响的0行) (2行受影响)

第一个结果指示属性表为空 第二个是有2个项目

然后在表属性中运行以下插入操作失败,出现上述唯一约束错误

INSERT INTO [dbo].[Attribute] ([IDproject], [name], [IDtype], [IDgroup], [color], [protected], [datemodified])
        SELECT DISTINCT
            p.[ID],'dummy',t.[ID],g.[ID],-1,0,getdate()
        FROM [dbo].[Project] p
        INNER JOIN [dbo].[Group] g ON g.[name]='none' AND g.[IDproject] = p.[ID]
        INNER JOIN [dbo].[AttributeType] t ON t.[format]='text' AND g.[IDproject] = p.[ID]
        WHERE p.[name]='TESTPROJ'
GO

如何在空表上得到这样的错误?

我自己找到了解决方案:派生SELECT返回2条记录,其中包含“dummy”,这是因为它与表AttributeType中的一个重复,而AttributeType执行内部联接。

唯一的方法是,您使用的查询产生了重复键,在这种情况下,所有行上的名称都设置为“dummy”,所以,如果同一个p.ID在多行上,它将导致重复键错误。您的表“属性”与项目表具有外键关系。因此,如果您试图在属性表中插入任何值,它应该在**项目**表中。在您的例子中,似乎您正在插入项目表中不存在的IDproject值。因此,请确保IDproject value是项目表中显示的值。如果你想进一步澄清,请告诉我好的,我知道了。派生的SELECT返回2条带有“dummy”的记录,这是因为它与表AttributeType中的一个重复,AttributeType执行内部联接。请发布您自己问题的答案,使其不再出现在“未答复”搜索中。请使字段[name]唯一,然后在插入时将其硬编码为“dummy”。当然,如果插入的行数超过1行,则会出错,因为第二行的值也将为“dummy”。