0

MSSQL Serverには、複合主キー( StudentIDCourseID )を持つテーブルStudentCourseがあります。選択した学生を別のコースに変更しようとしています。各コース グループの1 つの学生レコードが原因で、操作を実行できません。UPDATE

StudentID CourseID

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

(1, 2)(1, 3)レコードのCourseID5に更新できますが、 (1, 1)レコードのCourseID5に更新できません。同様に、(2, 2)(2, 3)レコードのCourseID5に更新できますが、 (2,4)レコードのCourseID5に更新することはできません。

そのようなCourseIDグループの 1 つのレコードだけが、そのCourseIDフィールドを変更することを妨げています。次のエラーが表示されます。

PRIMARY KEY 制約 'PK_StudentCourse' に違反しています。オブジェクト 'StudentCourse' に重複するキーを挿入できません。ステートメントは終了されました。

各グループの最初または最後のレコードであるかどうかわからないため、CourseIDの変更が禁止されています。StudentCourseテーブルに CourseID = 5 のレコードがなく、Course テーブルに CourseID が 5 のコースレコードがあること確かです

どんな助けでも大歓迎です。

4

2 に答える 2

3

表示されているエラーは、別の既存のレコードと同じ値の主キーを持つレコードを作成しようとしていることを意味します。あなたはここで間違いを犯していますが、あなたの間違いが何であるかを理解するのに十分な情報を提供していません.

問題が発生した場合は、問題を説明できる小さな再現を作成して、他のユーザーに見せることができると便利です。単純な再現を作成しようとすると、再現が実際には問題なく動作することがあります。これにより、この動作中の「再現」と私の問題ケースに何か違いがあることがわかります。私にとっての次のステップは、それらの間のギャップを埋め、どちらかを変更して、動作の違いがなくなるまで近づけることです。それを行ったステップは、通常、調査されている動作の原因を明らかにします。

あなたの場合、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

問題が見つかりました。クエリ文字列の条件を作成していたときに、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 条件なしで主キー ルールに違反していました。時間をありがとう、仲間。

于 2011-05-02T01:15:59.707 に答える