SQL - 更新时违反主键

时间:2016-05-30 13:32:16

标签: sql sql-server

这是我的表格:

enter image description here

我执行此请求:

UPDATE efep SET efep.ID_ETAT_PERSONNE = 9
FROM ETAT_FICHE_ETAT_PERSONNE efep
WHERE efep.ID_ETAT_PERSONNE IN (2,3,7) AND NOT EXISTS (
   SELECT 1  
   FROM ETAT_FICHE_ETAT_PERSONNE efep2
   WHERE efep2.ID_ETAT_PERSONNE = 9 and efep2.ID_ETAT_PERSONNE = efep.ID_ETAT_PERSONNE);

我有这个错误:

Msg 2627, Level 14, State 1, Line 127
Violation of PRIMARY KEY constraint 'PK_ETAT_FICHE_ETAT_PERSONNE'. Can not insert duplicate key in object 'dbo.ETAT_FICHE_ETAT_PERSONNE'.
The statement has been terminated.

为什么错了??

主键:

ALTER TABLE [dbo].[ETAT_FICHE_ETAT_PERSONNE] ADD  CONSTRAINT [PK_ETAT_FICHE_ETAT_PERSONNE] PRIMARY KEY CLUSTERED 
(
    [ID_ETAT_FICHE] ASC,
    [ID_ETAT_PERSONNE] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

2 个答案:

答案 0 :(得分:1)

我认为它是EXISTS()中的拼写错误:

   WHERE efep2.ID_ETAT_PERSONNE = 9 and efep2.ID_ETAT_PERSONNE = efep.ID_ETAT_PERSONNE);

不应该是:

   WHERE efep2.ID_ETAT_PERSONNE = 9 and efep2.ID_ETAT_FICHE = efep.ID_ETAT_FICHE);

看起来你用错误的列连接记录,所以你实际上检查了类似的东西:

WHERE efep2.ID_ETAT_PERSONNE = 9 and efep2.ID_ETAT_PERSONNE = 7/2/3

哪种情况不可能而且永远都是假的,因此 - 不会起作用。

正如@ M.Ali指出的那样,这个逻辑不能这样做,即使有了这个改变,只要你有相同ID_ETAT_PERSONNE in(2,3,7)的多个1记录,你仍然会得到重复键。

答案 1 :(得分:0)

我认为你的where子句最终将返回所有行(示例中显示的行)非常简单。

如果您将ID_ETAT_PERSONNE列更新为9,那么您最终会得到重复的内容。

ID_ETAT_PERSONNE  ID_ETAT_PERSONNE
       1                  9
       1                  9
       2                  9
       2                  9
       3                  9
       3                  9

由于这两个表上有一个复合主键,因此会出错。

您尝试实现的逻辑无法完成,最终会出现重复的主键值。

您可以在符合条件的9列中插入值[ID_ETAT_PERSONNE]

INSERT INTO ([ID_ETAT_FICHE] , [ID_ETAT_PERSONNE])
SELECT efep.[ID_ETAT_FICHE] , 9
FROM ETAT_FICHE_ETAT_PERSONNE efep
WHERE efep.ID_ETAT_PERSONNE IN (2,3,7) 
AND NOT EXISTS (SELECT 1  
                FROM ETAT_FICHE_ETAT_PERSONNE efep2
                WHERE efep2.ID_ETAT_PERSONNE = 9 
                  and efep2.[ID_ETAT_FICHE] = efep.[ID_ETAT_FICHE])
GROUP BY efep.[ID_ETAT_FICHE]