2016-05-30 34 views
1

這是我的表:SQL - 違反主鍵對更新

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] 

回答

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); 

外貌像你co通過錯列nnect記錄,讓你去查看這樣的:

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

這是不可能的,永遠是假的,所以 - 將無法正常工作。

正如@ M.Ali指出了,這種邏輯不能這樣做,即使有這樣的變化,你仍然會只要你有更多然後1條記錄與同ID_ETAT_PERSONNE in(2,3,7)

+0

該查詢仍然會出錯,出現'Duplicate Primary key violation error'錯誤。 –

+0

@ M.Ali Yup,你說得對。 – sagi

0
結束了重複鍵

我認爲它很簡單,你的where子句將最終返回所有行(在你的例子中顯示的行)。

如果你是更新ID_ETAT_PERSONNE列到9你會最終得到類似的重複。

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

由於在這兩個表上有複合主鍵,所以會出錯。

您嘗試實施的邏輯無法完成,您將以重複的主鍵值結束。

對於[ID_ETAT_PERSONNE]列,您可以插入值爲9的列,它符合您的標準。

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]