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

时间:2011-05-01 12:17:41

标签: sql sql-server sql-update shared-primary-key

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 。我确定在 StudentCourse 表中没有 CourseID = 5 的记录,而且我的 CourseID 5 <的课程记录/ em>在课程表中。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:3)

您看到的错误意味着您尝试使用与另一个现有记录相同的主键值创建记录。你在这里犯了一个错误,但你没有提供足够的信息,以了解你的错误。

当我遇到问题时,我发现创建一个可以说明问题的小型repro非常有用,这样我就可以向其他用户展示。有时,当我尝试创建一个简单的repro时,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

我可以看到这些工作正常。

尝试以不同的方式了解您的行为,并找到问题的原因。

答案 1 :(得分:1)

我发现了问题。当我为查询字符串构建条件时,一个条件没有添加GroupID条件。当该记录包含在查询字符串中时,查询字符串碰巧错过了GroupID crieria。它发生在以下。

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标准的主键规则。谢谢你的时间,伙计。