2010-05-13 3 views
0

Je tente de remplacer tous les enregistrements d'un jour donné dans une table donnée. La table a une clé primaire composite composée de 7 champs. Un tel champ est la date.Clés primaires composites SQL Server

J'ai supprimé tous les enregistrements qui ont une valeur de date de 2/8/2010. Lorsque j'essaie d'insérer ensuite des enregistrements dans la table pour le 2/8/2010, j'obtiens une violation de clé primaire. Les enregistrements que je tente d'insérer sont uniquement pour 2/8/2010.

Puisque la date est un composant du PK, ne devrait-il pas y avoir aucun moyen de violer la contrainte tant que la date que j'insère n'est pas déjà dans la table?

Merci d'avance.

Répondre

2

Vous pourriez avoir des doublons dans les données que vous insérez.

De même, il est très, très, très mauvais d'avoir une clé primaire composée de 7 champs. La bonne façon de gérer cela est d'avoir une clé d'identité de substitution et un index unique sur les sept domaines. Se joindre à des tables enfant sur 7 feilds est une garantie de performance médiocre et la mise à jour des enregistrements quand ils ont des dossiers enfants devient un cauchemar et peut complètement bloquer votre système. Une clé primaire devrait être unique adnit ne devrait JAMAIS changer.

+0

Merci. Je suis conscient des défauts dans la conception de la table, mais malheureusement, ce n'est pas à moi de changer, juste pour le faire fonctionner. – Colin

+0

En outre, vous aviez raison! Je dois avoir deux dossiers chargés dans l'autre table, qui n'avait pas de PK. Merci encore. – Colin

+1

LOL, comment pensez-vous que je connaissais la réponse si rapidement, si je ne l'avais pas fait moi-même une fois ou deux. – HLGEM

2

Toutes les lignes comportent-elles uniquement un composant de date dans ce champ (par exemple, l'heure est toujours minuit: 00:00:00)? Si ce n'est pas le cas, vous devez supprimer les lignes> = 2/8/2010 et < 2/9/2010. De même, êtes-vous sûr de ne pas tenter accidentellement d'insérer deux enregistrements avec la même date (et les mêmes valeurs dans les 6 autres champs PK)?

0

Peut-être qu'il se passe quelque chose que vous ne connaissez pas. Lorsque vous insérez une ligne et obtenez une violation de clé primaire, essayez de faire un SELECT avec les valeurs de clé appropriées de la ligne qui n'a pas pu être insérée (après avoir fait un ROLLBACK, bien sûr) et voir ce que vous obtenez. Ou il y a peut-être un déclencheur sur la table dans lequel vous insérez des données qui insèrent des lignes dans une autre table qui utilise la même clé primaire mais n'a pas été nettoyée.

Vous pouvez essayer ce qui suit SELECT pour voir ce qui se présente:

SELECT * DE YOUR_TABLE OU DATE> 2/7/2010 ET DATE < 2/9/2010;

(Je ne suis pas sûr du bon format pour une constante de date dans SQL Server car je ne l'ai pas utilisée depuis quelques années, mais je suis sûr que vous avez l'idée). Voyez ce que vous obtenez.

Bonne chance.

Questions connexes