这是我的表格:
我执行此请求:
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]
答案 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]