Нарушение ограничения ограничения первичного ключа - PullRequest
0 голосов
/ 21 августа 2010

Я использую SSMS 2008 и пытаюсь вставить этот запрос, но получаю следующую ошибку:

Msg 2627, Level 14, State 1, Line 1
Violation of PRIMARY KEY constraint 'PK_j5c_MasterMeasures'. Cannot insert duplicate key in object 'dbo.j5c_MasterMeasures'.
The statement has been terminated.

Вот мой запрос:

insert into J5C_MasterMeasures (studentid, measuredate, measureid, RIT)

select A.studentid, A.measuredate, B.measurename+' ' +B.LabelName, A.score_14
from [J5C_Measures_Sys] A
join [J5C_ListBoxMeasures_Sys] B on A.MeasureID = B.MeasureID 
join sysobjects so on so.name = 'J5C_Measures_Sys' 
join syscolumns sc on so.id = sc.id 
join [J5C_MeasureNamesV2_Sys] v on v.Score_field_id = sc.name
where so.type = 'u' and sc.name = 'score_14' and a.score_14 is not null 
AND A.STUDENTID IS NOT NULL AND A.MEASUREDATE IS NOT NULL AND B.MEASURENAME IS NOT NULL
group by a.studentid, a.measuredate, B.measurename, B.LabelName, A.score_14
--HAVING COUNT(*) > 1

Странно то, чтоесли я запускаю только запрос SELECT (без INSERT) и включаю инструкцию HAVING COUNT, он возвращает 0 записей для> 1. Так что я не знаю, откуда исходит дубликат!

Ответы [ 4 ]

3 голосов
/ 21 августа 2010

Исходя из вашего предыдущего вопроса, я считаю, что ваш первичный ключ - A.studentid, A.measuredate, B.measurename. Пожалуйста, поправьте меня, если я ошибаюсь.

Поскольку вы группируете по двум дополнительным столбцам B.LabelName и A.score_14 в дополнение к вашим столбцам составного первичного ключа, если есть какие-либо дубликаты - которые могут быть предоставлены, если они имеют разные значения либо B.LabelName, либо A.score_14 - вы нарушите ограничение первичного ключа, и эта ошибка будет выдана.

Ваши данные просто не будут достаточно уникальными, чтобы удовлетворить ваш первичный ключ - который утверждает, что в вашей таблице может существовать ТОЛЬКО ОДНА СТРОКА с уникальной комбинацией A.studentid, A.measuredate, B.measurename

0 голосов
/ 21 августа 2010

Вы должны перепроверить свой тест HAVING. Убедитесь, что вы включаете только столбец (столбцы), содержащий PK в предложении GROUP BY.

0 голосов
/ 21 августа 2010

Использование:

select A.studentid, A.measuredate, B.measurename+' ' +B.LabelName, A.score_14
  from [J5C_Measures_Sys] A
  join [J5C_ListBoxMeasures_Sys] B on A.MeasureID = B.MeasureID 
  join sysobjects so on so.name = 'J5C_Measures_Sys' 
  join syscolumns sc on so.id = sc.id 
  join [J5C_MeasureNamesV2_Sys] v on v.Score_field_id = sc.name
 where so.type = 'u' and sc.name = 'score_14' and a.score_14 is not null 
   AND A.STUDENTID IS NOT NULL AND A.MEASUREDATE IS NOT NULL AND B.MEASURENAME IS NOT NULL
   AND NOT EXISTS(SELECT NULL
                    FROM J5C_MasterMeasures x
                   WHERE x.studentid = a.studentid
                     AND x.measuredate = a.measuredate
                     AND x.measureid = B.measurename +' '+ B.LabelName)
group by a.studentid, a.measuredate, B.measurename, B.LabelName, A.score_14

NOT EXISTS отфильтрует уже существующие данные.

0 голосов
/ 21 августа 2010

Есть ли данные уже в таблице J5C_MasterMeasures? Если это так, убедитесь, что то, что вы вставляете, еще не существует

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...