SQL更新:无法更改第一条记录的复合键值之一

| 在MSSQL Server中,我有一个带有复合主键(StudentID,CourseID)的StudentCourse表。我正在尝试将所选的学生更改为另一门课程。每个课程组的一个学生记录阻止我进行“ 0”操作。
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。我确定StudentCourse表中没有CourseID = 5的记录,并且Course表中有CourseID为5的课程记录。 任何帮助,将不胜感激。     
已邀请:
您看到的错误意味着您正在尝试创建一个与另一个现有记录具有相同主键值的记录。您在这里犯了一个错误,但是您没有提供足够的信息来了解您的错误是什么。 当我遇到问题时,我发现创建一个可以说明问题的小型程序很有用,这样我就可以向其他用户展示它。有时,当我尝试创建简单的复制时,复制实际上可以正常工作。这使我知道此“ repro”工作和问题情况有所不同。对我而言,下一步是弥合它们之间的鸿沟,修改它们中的任何一个以使其更接近,直到行为差异消失为止。做到这一点的步骤通常揭示了被调查行为的罪魁祸首。 在您的情况下,我可以执行以下简单步骤来证明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
我可以看到这些工作正常。 尝试了解您所做的不同操作,您会找到问题的原因。     
我发现了问题。当我为查询字符串构建条件时,一个条件不是添加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标准的主键规则。伙伴们,感谢您的宝贵时间。     

要回复问题请先登录注册