在MSSQL Server中,我有一个表StudentCourse与复合主键 (StudentID, CourseID)。我正在尝试将选中的学生换到另一门课程。每个课程组有1个学生记录妨碍我做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。我确信在StudentCourse表中没有CourseID = 5的记录,我在 course 表中有CourseID为5的课程记录。
您看到的错误意味着您正在尝试创建一个与另一个现有记录具有相同主键值的记录。你在这里犯了一个错误,但是你没有提供足够的信息来理解你的错误是什么。
当我遇到问题时,我发现创建一个可以说明问题的小副本很有用,这样我就可以向其他用户展示它。有时,当我尝试创建一个简单的repro时,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条件的主键规则。谢谢你的时间,朋友们。