Обновление SQL: невозможно изменить одно из значений составного ключа первой записи - PullRequest
0 голосов
/ 01 мая 2011

В MSSQL Server , у меня есть таблица StudentCourse с составным первичным ключом ( StudentID , CourseID ).Я пытаюсь изменить выбранного студента на другой курс. Одна запись студента каждой группы курса мешает мне выполнить UPDATE операцию.

StudentID CourseID

   1          1
   1          2
   1          3
   2          2
   2          3
   2          4

Я могу обновить (1, 2) , (1, 3) записей ' CourseID до 5 , но я не могу обновить (1, 1) записей CourseID до 5 .Аналогично, я могу обновить (2, 2) , (2, 3) записей ' CourseID до 5 , но я могу'• обновить (2,4) записей CourseID до 5 .

Только одна запись из такой CourseID группымешает мне изменить его CourseID поле.Я получаю следующую ошибку.

Нарушение ограничения PRIMARY KEY 'PK_StudentCourse'.Невозможно вставить дубликат ключа в объект 'StudentCourse'.Заявление было прекращено.

Я не знаю, первая или последняя запись в каждой группе запрещает мне изменять CourseID .Я уверен, что нет записи с CourseID = 5 в таблице StudentCourse , и у меня есть запись курса с CourseID из 5 в Курс Таблица.

Буду признателен за любую помощь.

Ответы [ 2 ]

3 голосов
/ 01 мая 2011

Ошибка, которую вы видите, означает, что вы пытаетесь создать запись с тем же значением первичного ключа, что и другая существующая запись. Вы делаете ошибку здесь, но не даете достаточно информации, чтобы понять, в чем ваша ошибка.

Когда у меня возникает проблема, я считаю полезным создать маленькое репро, которое может проиллюстрировать проблему, чтобы я мог показать ее другим пользователям. Иногда, когда я пытаюсь создать простое воспроизведение, оно на самом деле работает без проблем. Это позволяет мне понять, что в этом рабочем «репро» и моем проблемном случае есть что-то другое Следующим шагом для меня будет преодоление разрыва между ними, изменение любого из них, чтобы сделать их ближе, пока разница в поведении не исчезнет. Шаг, который сделал это, обычно выявляет виновника исследуемого поведения.

В вашем случае я могу сделать следующие простые шаги, чтобы доказать, что SQL Server работает должным образом:

Я создаю таблицу:

CREATE TABLE [dbo].[StudentCourse](
    [StudentID] [int] NOT NULL,
    [CourseID] [int] NOT NULL,
 CONSTRAINT [PK_StudentCourse] PRIMARY KEY CLUSTERED 
(
    [StudentID] ASC,
    [CourseID] ASC
))

Я добавляю данные теста в:

INSERT INTO [dbo].[StudentCourse] values (1,1)
INSERT INTO [dbo].[StudentCourse] values (1,2)
INSERT INTO [dbo].[StudentCourse] values (1,3)
INSERT INTO [dbo].[StudentCourse] values (2,2)
INSERT INTO [dbo].[StudentCourse] values (2,3)
INSERT INTO [dbo].[StudentCourse] values (2,4)

Я выполняю обновления, которые вы описали:

UPDATE [dbo].[StudentCourse] SET CourseID = 5 where StudentId = 2 and CourseID = 4
UPDATE [dbo].[StudentCourse] SET CourseID = 5 where StudentId = 1 and CourseID = 1

Я вижу, что они работают так же, как и должны.

Постарайтесь понять, что вы делаете по-другому, и вы найдете причину своей проблемы.

1 голос
/ 02 мая 2011

Я нашел проблему.Когда я строил Условия для строки запроса, одно условие не добавляло критерии GroupID.Строка запроса не соответствует критериям GroupID, когда эта запись была включена в строку запроса.Это происходило следующим образом.

UPDATE StudentCourse SET CourseID = 5 WHERE CourseID = 1 AND StudentID IN(2,3)
UPDATE StudentCourse SET CourseID = 5 WHERE StudentID IN(1,2,3)

UPDATE StudentCourse SET CourseID = 6 WHERE CourseID = 2 AND StudentID IN(2,3)
UPDATE StudentCourse SET CourseID = 6 WHERE StudentID IN(2,3,4)

Конечно, мой запрос нарушал правило первичного ключа без критериев CourseID.Спасибо за ваше время, друзья.

...