SQLアップデート:最初のレコードの複合キー値の1つを変更できません
-
27-10-2019 - |
質問
の MSSQLサーバー, 、テーブルがあります StudentCourse とともに 複合プライマリキー (学生証, 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. 。 Similary、更新できます (2, 2), (2, 3) 記録' CourseID に 5, 、しかし、更新できません (2,4) 記録 CourseID に 5.
そのような記録は1つだけです CourseID グループは私がそれを変えることを妨げています CourseID 分野。次のエラーが発生しています。
主要な制約「PK_StudentCourse」の違反。オブジェクト「StudentCourse」に重複キーを挿入できません。ステートメントは終了されました。
各グループの最初の記録であるか最後の記録であるかはわかりません CourseID. 。記録はないと確信しています COURSEID = 5 の StudentCourse テーブル、そして私はコースレコードを持っています CourseID の 5 の コース テーブル。
どんな助けも感謝します。
解決 2
問題を見つけました。クエリ文字列の条件を構築していたとき、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基準なしに主要なキールールに違反していました。あなたの時間をありがとう、仲間。
他のヒント
あなたが見ているエラーは、別の既存のレコードと同じ値の値を持つレコードを作成しようとしていることを意味します。あなたはここで間違いを犯していますが、あなたの間違いが何であるかを理解するために、あなたは十分な情報を与えていません。
問題がある場合、問題を説明できる小さな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
私はこれらの仕事が彼らがすべきであると同じように見ることができます。
あなたが何をしているのかを理解してみてください。そうすれば、問題の原因が見つかります。