7
votes

Modifier la clé primaire (ID) d'une ligne dans une table et déplacer les autres vers le bas

J'ai une table mysql qui ressemble à ceci:

Entrez la description de l'image ici

Je voulais changer de telle que l'entrée avec ID 15 (Femmes, Robe) a maintenant une clé primaire de 8, puis les autres sont déplacées par une, donc par exemple, les enfants d'enfants seront maintenant 9, etc. Y a-t-il un façon facile de faire cela via phpmyadmin ou une requête SQL? En outre, parce que l'ID 15 est déjà utilisé comme une clé étrangère ailleurs, je voulais que ce changement soit reflété sur la place dans d'autres tables.


3 commentaires

. . Ne changez pas les clés primaires. Le fait qu'il soit utilisé souligne pourquoi vous ne devriez pas le changer.


@Gordonlinoff Et si je dois?


SET FORND_KEY_CHECKS = 0; ; Définir étrangers_key_checks = 1;


3 Réponses :


5
votes

On ne devrait pas changer la clé primaire - jamais. De plus, il peut être bénéfique de penser aux PKS en tant que valeurs non numériques. Imaginez que vous utilisiez des GUDS autogénérées pour vos touches principales.

Si vous souhaitez renuméroter vos articles, la colonne que vous souhaitez modifier doit être une colonne numérique séparée, que vous traitez explicitement en tant que nombre de séquences. Ensuite, vous pouvez faire ce que vous voulez avec trois instructions Mettre à jour : xxx


0 commentaires

4
votes

Vous ne pouvez pas modifier une "clé primaire" et pour une bonne raison. La clé principale est susceptible d'être utilisée par d'autres tables pour faire référence à une rangée particulière. Donc, un changement ne serait pas local dans la table, il faudrait être dans chaque table de référencement.

Si vous souhaitez modifier les valeurs de la colonne, vous devez d'abord laisser tomber la principale contrainte de clé.

Si vous devez vraiment faire une telle chose, voici quelques considérations:

  1. Pour changer la valeur de la clé primaire, vous devez déposer la principale contrainte de clé en premier.
  2. déposez toutes les références de clé étrangère à la table. Sinon, vous obtiendrez des erreurs inattendues ou des suppressions inattendues lorsque vous modifiez des valeurs ( sur Suppr Cascade ).
  3. Créez une table de mappage qui a l'ancienne valeur et la nouvelle valeur.
  4. Mettez à jour les valeurs dans la table principale.
  5. Mettez à jour les références "Clé étrangère".
  6. Ré-appliquer les contraintes de clé étrangère sur les tables distantes
  7. ré-appliquer la principale contrainte de clé sur la table d'origine

    (Je dois admettre que j'aurais peut-être manqué quelque chose, car ce n'est pas quelque chose que je ferais jamais.)

    Changer une clé primaire, en particulier celle utilisée dans les relations clés étrangères, ne doit pas être prise à la légère. Le but de ces clés est de maintenir l'intégrité relationnelle. Vous ne devriez pas être dérangé par des lacunes dans la clé ou le manque de séquentialité. Si vous souhaitez un numéro séquentiel, vous pouvez l'ajouter dans une autre colonne.


0 commentaires

3
votes

Peut-être que vous devriez modifier votre table enfant FK avec une opération de mise à jour sur la mise à jour de manière à ce que les changements sur la table des parents se reflètent sur la table enfant.

Voir la référence MySQL pour FK's: http://dev.mysql.com/doc/refman/5.1/fr/create- Table-Foreign-Keys.html

Plus tard, vous pouvez exécuter ce qui suit: xxx


0 commentaires