web-dev-qa-db-fra.com

Pouvons-nous mettre à jour les valeurs de clé primaire d'une table?

Pouvons-nous mettre à jour les valeurs de clé primaire d'une table?

28
akp

Il est communément admis que les clés primaires doivent être immuables (ou aussi stable que possible puisque l'immuabilité ne peut pas être appliquée dans la base de données). Bien que rien ne vous empêche de mettre à jour une clé primaire (à l'exception de la contrainte d'intégrité), ce n'est peut-être pas une bonne idée:

Du point de vue des performances:

  • Vous devrez mettre à jour toutes les clés étrangères faisant référence à la clé mise à jour. Une seule mise à jour peut entraîner la mise à jour de potentiellement beaucoup de tables/lignes.
  • Si les clés étrangères ne sont pas indexées (!!), vous devrez maintenir un verrou sur la table des enfants pour garantir l'intégrité. Oracle ne tiendra le verrou que pendant une courte période, mais cela fait quand même peur.
  • Si vos clés étrangères sont indexées (comme elles devraient l'être), la mise à jour entraînera la mise à jour de l'index (suppression + insertion dans la structure d'index), ceci est généralement plus cher que la mise à jour réelle de la table de base.
  • Dans les tables ORGANIZATION INDEX (dans d'autres SGBDR, voir clé primaire en cluster), les lignes sont triées physiquement par la clé primaire. Une mise à jour logique entraînera une suppression physique + insertion (plus cher)

Autres considérations:

  • Si cette clé est référencée dans un système externe (cache d'application, autre DB, exportation ...), la référence sera rompue lors de la mise à jour.
  • en outre, certains SGBDR ne prennent pas en charge CASCADE UPDATE, en particulier Oracle .

En conclusion, lors de la conception, il est généralement plus sûr d'utiliser une clé de substitution à la place d'une clé primaire naturelle qui est censée ne pas changer - mais peut éventuellement devoir être mise à jour en raison de modifications des exigences ou même d'une erreur de saisie de données.

Si vous devez absolument mettre à jour une clé primaire avec une table enfant, voir ce message de Tom Kyte pour une solution .

38
Vincent Malgrat

Les attributs de clé primaire sont tout aussi actualisables que tout autre attribut d'une table. La stabilité est souvent une propriété souhaitable d'une clé mais certainement pas une exigence absolue. S'il est logique d'un point de vue commercial de mettre à jour une clé, il n'y a aucune raison fondamentale pour laquelle vous ne devriez pas.

10
nvogel

Vous pouvez aussi longtemps que

  • La valeur est unique
  • Aucune clé étrangère existante n'est violée
6
Richard

Du point de vue de la théorie de la base de données relationnelle, la mise à jour de la clé primaire d'une table ne devrait poser aucun problème, à condition qu'il n'y ait pas de doublons entre les clés primaires et que vous n'essayez pas de mettre une valeur NULL dans l'une des clés primaires. colonnes clés.

3
Beto Boullosa

Réponse courte: oui, vous le pouvez. Bien sûr, vous devrez vous assurer que la nouvelle valeur ne correspond à aucune valeur existante et que les autres contraintes sont satisfaites (duh).

Qu'est-ce que vous essayez de faire exactement?

2
Manoj Govindan

Vous pouvez, dans certaines circonstances.

Mais le fait que vous considériez ceci est un signe fort qu'il y a quelque chose qui ne va pas dans votre architecture: les clés primaires doivent être purement techniques et n'avoir aucune signification commerciale. Il ne devrait donc jamais être nécessaire de les changer.

Thomas

1
Thomas Weller