2017-08-01 34 views
1

当INSERT语句尝试向空表中添加新记录时(属性)(没有记录),我的INSERT语句失败。 我惊讶于系统引发的错误:在空表上抛出UNIQUE约束异常INSERT [sql-server]

违反UNIQUE KEY约束'CK_Attribute_Name_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 

我skiped外键引用和默认值,这似乎并没有在这方面的兴趣。 UNIQUE约束适用于[name]和[IDproject]。

当运行下面的语句

SELECT * 
    FROM [dbo].[Attribute] 
GO 
SELECT * 
    FROM [dbo].[Project] 
GO 

我得到(受影响的2行(S))的结果

(影响0行(S))

的第一个结果表示属性表为空 第二秒表示有2 项目小号

然后运行下面的INSERT表属性它与上面提到的唯一约束错误

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 

我怎样才能在空表上这样的错误而失败?

+3

唯一的方法是您正在使用的查询生成重复键,在这种情况下,所有行上的名称都设置为'dummy',因此如果相同的p.ID位于多个行上,则会导致重复的键错误 – MWillemse

+0

你的表**“属性”**与**项目**表有外键关系。所以如果你尝试在Attribute表中插入任何值,它应该在** Project **表中。在你的情况下,好像你插入**项目表中不存在的** IDproject **值。因此,请确保IDproject值是Project表中存在的值。让我知道如果你想进一步澄清 –

+1

好吧,我明白了。派生的SELECT返回2个记录,其中'dummy'由于重复的INTO表中的一个,AttributeType,INNER JOIN被执行。 –

回答

0

我自己找到了解决方案:派生的SELECT返回2个记录,由于重复的INTO表的一个表格AttributeType与INNER JOIN执行,导致SELECT为'dummy'。