Je sais très bien que ça ne devrait jamais arriver. Jamais. Cependant, j'ai récemment commencé à travailler dans une entreprise dont la conception de la base de données ou la validation des entrées n'était pas des meilleures, et cette situation s'est présentée.
Il existe une table que nous appellerons "emplois "*. Les emplois ont une clé primaire, "ID". Le travail avec l'ID de 1 a beaucoup de données associées avec lui ; Cependant, stupidement, quelqu'un a dupliqué ce travail comme ID 2 (cela s'est produit environ ~500 fois jusqu'à présent). Toutes les informations des deux doivent être fusionnées sous l'identifiant 1 (ou 2, peu importe).
Les colonnes sont liées par une clé étrangère avec UPDATE : CASCADE et DELETE : RESTRICT. Elles ne s'appellent pas toutes jobs_id.
Est-ce que ma seule option (apparemment raisonnable) est de.. :
- Changer l'id 1 en quelque chose dont je peux garantir qu'il n'est pas utilisé (2 147 483 647).
- Supprimer temporairement la clé étrangère DELETE : RESTRICT
- Supprimer l'entrée avec l'id 1
- Mettre à jour l'id 2 en 2 147 483 647 (pour le lier à toutes les autres entrées)
- Changer l'id 2,147,483,647 en id 2
- Rétablir SUPPRIMER : RESTRICT
Étant donné qu'aucune partie du code n'effectue réellement une suppression (la restriction n'est là que par sécurité (quelqu'un qui modifie directement la base de données)), et que la mise à jour en cascade est maintenue, les données ne devraient pas être désynchronisées. Cela semble cependant désordonné.
Cela sera enveloppé dans une transaction.
Je pourrais écrire quelque chose pour itérer à travers chaque table (~180) et chaque colonne pour trouver certains noms / conditions, puis mettre à jour de 1 à 2, mais cela nécessiterait une maintenance lorsqu'une nouvelle table / colonne apparaîtrait.
Comme cela s'est produit à plusieurs reprises et que je ne vois pas de réécriture pour empêcher que cela se produise de sitôt, la "solution" (le pansement) doit être semi-automatique.
- pas le vrai nom de la table. Son identité a été déguisée pour qu'il (ou elle) ne soit pas victime d'intimidation.
J'apprécie toute contribution.