0

MSSQL Server中,我有一个带有复合主键StudentIDCourseID)的StudentCourse表。我正在尝试将所选学生更改为另一门课程。每个课程组的一个学生记录阻止我做手术。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字段。我收到以下错误。

违反主键约束“PK_StudentCourse”。无法在对象“StudentCourse”中插入重复键。该语句已终止。

我不知道是每组的第一条记录还是最后一条记录禁止我更改CourseID。我确定StudentCourse表中没有CourseID = 5的记录,并且我在Course表中有CourseID5的课程记录。

任何帮助,将不胜感激。

4

2 回答 2

3

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

当我遇到问题时,我发现创建一个小的 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

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

试着理解你在做什么不同,你会找到问题的原因。

于 2011-05-01T12:47:50.743 回答
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 标准的主键规则。谢谢你的时间,伙计们。

于 2011-05-02T01:15:59.707 回答