简体   繁体   English

SQL -- 更新时违反主键

[英]SQL -- violation of Primary Key on update

This is my table:这是我的表:

在此处输入图片说明

I do this request:我做这个请求:

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

I have this error:我有这个错误:

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.

Why is wrong ..?为什么错了..?

Primary Key:首要的关键:

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]

I think its a typo inside the EXISTS() :我认为这是EXISTS()一个错字:

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

Isn't it supposed to be :难道不应该是:

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

Looks like you connect the record by the wrong column, so you actually checked something like:看起来您通过错误的列连接了记录,因此您实际上检查了以下内容:

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

Which is not possible and will always be false, therefore - won't work.这是不可能的,并且总是错误的,因此 - 行不通。

As @M.Ali pointed up, this logic can not be done like this, even with this change, you will still end up with duplicates key as long as you have more then 1 record with the same ID_ETAT_PERSONNE in(2,3,7)正如@M.Ali 指出的那样,这个逻辑不能这样完成,即使进行了这种更改,只要您有超过 1 条具有相同ID_ETAT_PERSONNE in(2,3,7)

I think its pretty simple your where clause will end up returning all the rows (rows shown in your example).我认为您的 where 子句最终将返回所有行(示例中显示的行)非常简单。

And if you are update ID_ETAT_PERSONNE column to 9 you will end up with duplicates like .如果您将ID_ETAT_PERSONNE列更新为9您最终会得到像 .

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

Since you have a composite primary key on these two tables, it will error out.由于您在这两个表上有一个复合主键,它会出错。

The logic you are trying to implement cannot be done, you will end up with duplicate Primary key values.您尝试实现的逻辑无法完成,您最终会得到重复的主键值。

You can do an insert of value 9 for [ID_ETAT_PERSONNE] column where it meets your criteria.您可以为符合您的条件的[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]

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM