Mise à jour unique ou de clés primaires dans MySQL
Je suis en train de construire une base de données de l'outil de gestion pour un client à utiliser sur son propre, et je vais avoir un problème traitant avec la possibilité de la mise à jour des clés primaires/uniques. Donc, étant donné que les données pour la mise à jour est passé par un script PHP sur un par ligne, voici ce que j'ai trouvé (à partir de "immédiatement" à "après un certain temps"):
- DELETE/INSERT au lieu de la mise à JOUR (affreux, j'ai maintenant...):
DELETE FROM table WHERE unique_key=x; DELETE FROM table WHERE unique_key=y; INSERT INTO table VALUES (unique_key=y, field=record1), (unique_key=x, field=record2);
- Modifier mon primaire/clé unique, puis de les remplacer par la valeur modifiée:
UPDATE table SET unique_key=x* WHERE unique_key=x; UPDATE table SET unique_key=y* WHERE unique_key=y; UPDATE table SET unique_key=y WHERE unique_key=x*; UPDATE table SET unique_key=x WHERE unique_key=y*;
- Ajouter un pas modifiables auto_increment champ "id" de tous mes tableaux, qui agissent comme un substitut à la clé primaire
Comme maintenant, je suis sur la route de l'ajout d'un champ "id" de tout. D'autres options?
Je ne suis pas vraiment comprendre ce que votre cas est ici. Pourquoi auriez-vous besoin de mettre à jour les clés primaires comme ça sur une base régulière? Je suppose que peut-être que votre problème est plus avec la conception d'un schéma, puis la mécanique de la façon dont vous allez mettre à jour ces lignes. Vous mentionnez l'option numéro trois (ce qui est EXTRÊMEMENT pratique courante dans les bases de données relationnelles) comme si c'est un coup. Pourquoi ne pas vos tables ont immuable clés primaires pour commencer?
Merci pour votre réponse. Sûrement la base de données pourrait avoir été conçu mieux, je me suis prise en main. Comme pour la fréquence de la mise à jour de clé, le cas échéant, il sera fait chaque maintenant et puis, le fait est qu'il peut, et j'ai été demandé pour quelque chose qui leur permettent de modifier autant que possible (il doit être un mini-phpmyAdmin, de le dire).
Dans la pratique, il n'y a pas une telle chose comme un "immuable" de la clé. Clé de substitution des valeurs changent parfois trop. Stabilité est un utile et souhaitable de la propriété au moment de choisir et de concevoir des clés: l'immuabilité ne l'est pas.
Merci pour votre réponse. Sûrement la base de données pourrait avoir été conçu mieux, je me suis prise en main. Comme pour la fréquence de la mise à jour de clé, le cas échéant, il sera fait chaque maintenant et puis, le fait est qu'il peut, et j'ai été demandé pour quelque chose qui leur permettent de modifier autant que possible (il doit être un mini-phpmyAdmin, de le dire).
Dans la pratique, il n'y a pas une telle chose comme un "immuable" de la clé. Clé de substitution des valeurs changent parfois trop. Stabilité est un utile et souhaitable de la propriété au moment de choisir et de concevoir des clés: l'immuabilité ne l'est pas.
OriginalL'auteur siberius.k | 2013-05-08
Vous devez vous connecter pour publier un commentaire.
Mise à jour d'une clé primaire n'est pas un problème; toutes les valeurs dans SQL (et dans le modèle relationnel) sont censés être mis à jour.
Le problème semble être permutation clés primaires, qui
L'ajout d'un "ID" de la colonne de chaque table ne vous aide pas. Le "unique_key" colonne encore doit être déclarée unique. L'ajout d'un "ID" de la colonne ne change pas que l'exigence de l'entreprise.
Vous pourrait swap de valeurs de clé primaire si MySQL pris en charge différée contraintes. (Reporté les contraintes sont une fonctionnalité dans le standard SQL.) Mais MySQL ne prend pas en charge cette fonctionnalité. Dans PostgreSQL, par exemple, vous pourriez le faire.
UPDATE table SET field='record2' WHERE unique_key=x;
J'avais juste à faire PHP trouver swap de cas et de les gérer avec une requête appropriée.Dans le cas général, vous ne pouvez pas permuter les détails par la mise à jour de tout ce mais la clé primaire parce que, dans le cas général, que pourrait impliquer la permutation autre candidat clés. (C'est le même problème en ajoutant une clé de substitution; reportable contraintes de travailler dans les deux cas.) Je suis en train d'imaginer un cas où ce genre de "l'identité échange" a un sens, mais je ne suis pas. Comment imaginez-vous?
Donc, j'ai enfin réussi à mettre en place un script PHP qui permettent de vérifier les doublons et les swaps parmi les entrants les valeurs modifiées, à comparer avec la copie temporaire de l'origine des données, et s'appuie requête en conséquence. Après tout, c'est pas la peine, vous avez raison. Ce que j'ai fait imaginer est fondamentalement une erreur que j'ai faite, la construction d'au moins deux table avec un concaténer champ comme clé primaire, plutôt que d'installer un multiple de clé primaire, en plus d'essayer de le faire fonctionner whaterver ils aimeraient modifier dans le futur, mais en fin de compte clés primaires doivent en effet être non modifiable. Merci pour votre perspicacité.
"clés primaires doivent en effet être non modifiable" je serais en désaccord avec que; j'ai été par le biais de plusieurs fusions, où la mère porteuse PKs a dû être modifié en vue de la fusion de données. Je ne peux pas encore imaginer un cas où permutation leur sens dans le monde réel. De toute façon, je suis content que vous avez trouvé une solution.
OriginalL'auteur Mike Sherrill 'Cat Recall'
Vous devriez être en mesure d'utiliser une expression case pour faire ce genre de mise à jour. Par exemple:
(code non testé)
OriginalL'auteur nvogel