Question

MSSQL Serveur , j'ai une table StudentCourse avec Composite clé primaire ( StudentID , CourseID ). Je suis en train de changer l'étudiant sélectionné à un autre cours. Une dossier étudiant de chaque groupe de cours me empêche de faire l'opération de UPDATE.

StudentID CourseID

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

I peut mettre à jour (1, 2) (1, 3) records' CourseID 5 , mais je ne peux pas mettre à jour (1, 1) dossier de CourseID 5 . Similairement, je peux mettre à jour (2, 2) , (2, 3) records' CourseID 5 , mais je ne peux pas mettre à jour (2,4) du disque CourseID 5 .

Un seul enregistrement de ces CourseID groupe me empêche de changer de CourseID terrain. Je reçois l'erreur suivante.

Violation de contrainte de clé primaire 'PK_StudentCourse'. Impossible d'insérer clé en double dans l'objet 'StudentCourse'. La déclaration a pris fin.

Je ne sais pas que ce soit premier ou dernier enregistrement de chaque groupe m'a interdit de changer CourseID . Je suis sûr qu'il n'y a pas record avec CourseID = 5 StudentCourse table, et j'ai un record du parcours avec CourseID de 5 Cours table.

Toute aide serait appréciée.

Était-ce utile?

La solution 2

Je trouve le problème. Quand je place les conditions de la chaîne de requête, une condition n'a pas été l'ajout de critères GROUPID. La chaîne de requête arrive à manquer que GroupID crieria lorsque cet enregistrement a été inclus dans la chaîne de requête. Il se passait comme suit.

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)

Bien sûr, ma requête contrevenait règle de clé primaire sans critères courseid. Merci pour votre temps, camarades.

Autres conseils

L'erreur que vous voyez signifie que vous êtes en train de créer un enregistrement avec la même valeur de clé primaire comme un autre enregistrement existant. Vous faites une erreur, mais vous ne donnez pas assez d'information pour comprendre ce que votre erreur est.

Quand j'ai un problème, je trouve utile de créer un petit repro, qui peut illustrer le problème, afin que je puisse le montrer à d'autres utilisateurs. Parfois, lorsque je tente de créer une repro simple, le fonctionne repro fait sans problème. Cela me permet de savoir qu'il ya quelque chose de différent dans ce travail « repro » et mon cas de problème. La prochaine étape pour moi serait de combler le fossé entre eux, de modifier l'un d'eux pour les rendre plus jusqu'à ce que la différence de comportement disparait. L'étape qui a rendu, révèle généralement la cause du comportement à l'étude.

Dans votre cas, je peux faire en suivant les étapes simples, pour prouver que SQL Server fonctionne comme prévu:

Je crée une table:

CREATE TABLE [dbo].[StudentCourse](
    [StudentID] [int] NOT NULL,
    [CourseID] [int] NOT NULL,
 CONSTRAINT [PK_StudentCourse] PRIMARY KEY CLUSTERED 
(
    [StudentID] ASC,
    [CourseID] ASC
))

ajouter des données de test dans:

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)

j'effectue les mises à jour que vous avez décrites:

UPDATE [dbo].[StudentCourse] SET CourseID = 5 where StudentId = 2 and CourseID = 4
UPDATE [dbo].[StudentCourse] SET CourseID = 5 where StudentId = 1 and CourseID = 1

Je peux voir que ces travaux comme ils le devraient.

Essayez de comprendre ce que vous faites différemment, et vous trouverez la cause de votre problème.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top