Je cherche depuis un moment maintenant mais je ne trouve pas de solution simple à mon problème. Je voudrais dupliquer un enregistrement dans une table, mais bien sûr, la clé primaire unique doit être mise à jour.
J'ai cette question:
INSERT INTO invoices
SELECT * FROM invoices AS iv WHERE iv.ID=XXXXX
ON DUPLICATE KEY UPDATE ID = (SELECT MAX(ID)+1 FROM invoices)
le problème est que cela modifie simplement ID
la ligne au lieu de copier la ligne. Est-ce que quelqu'un sait comment réparer ceci ?
// edit: Je voudrais faire cela sans taper tous les noms de champs car les noms de champs peuvent changer avec le temps.
CREATE TEMPORARY TABLE tmp SELECT bla FROM invoices WHERE bla; UPDATE tmp SET id=NULL; INSERT INTO invoices SELECT * FROM tmp;
Column 'id' connot be null
La réponse d'Alex nécessite quelques précautions (ex. Verrouillage ou transaction) dans les environnements multi-clients.
En supposant que le
AUTO ID
champ est le premier de la table (un cas habituel), nous pouvons utiliser des transactions implicites.À partir de la documentation MySQL:
la source
NULL
ou les0
deux sont acceptables. Pouvez-vous publier des captures d'écran du problème en le reproduisant et en le partageant ici.invoices
contient unID
champ AUTO_INCREMENT . La table sourcetmp
ne le fait pas. Afin d'obtenir la corrélation 1: 1 nécessaire lors de l'insertion, vous spécifiez a0
comme premier champ de la sélection, qui est le champ AUTO_INCREMENT de la table de destination. Letmp.*
sélectionne tous les champs de la table sourcetmp
. Parfait! Vous avez maintenant votre corrélation 1: 1. Réponse géniale @Tim.NULL
et ce0
n'est pas la même chose. Le contexte actuel est sur laAUTO_INCREMENT
fonctionnalité. Vous ne pouvez pas insérer0
uneNULL
valeur ou une valeur dans ces champs. Mais lorsque vous les utilisez comme entrées dans ce champ, la prochaine valeur de la séquence sera attribué à ce champ auto matiquement. Et d'où mon commentaire. Preuve sur SQL Fiddle: sqlfiddle.com/#!9/d619f/1Vous SAVEZ avec certitude que la TOUCHE DUPLICATE se déclenchera, vous pouvez donc sélectionner le MAX (ID) +1 au préalable:
la source
Votre approche est bonne mais le problème est que vous utilisez "*" à la place en enrôlant les noms de champs. Si vous mettez tous les noms de colonnes sauf la clé primaire, votre script fonctionnera comme un charme sur un ou plusieurs enregistrements.
INSERT INTO invoices (iv.field_name, iv.field_name,iv.field_name ) SELECT iv.field_name, iv.field_name,iv.field_name FROM invoices AS iv WHERE iv.ID=XXXXX
la source
Une réponse tardive que je connais, mais c'est toujours une question courante, je voudrais ajouter une autre réponse qui a fonctionné pour moi, avec seulement une
insert into
instruction sur une seule ligne , et je pense que c'est simple, sans créer de nouveau tableau (car il pourrait être un problème avec lesCREATE TEMPORARY TABLE
autorisations):La solution fonctionne pour la
AUTO_INCREMENT
colonne id, sinon, vous pouvez également ajouter uneID
colonne à l'instruction:C'est vraiment simple et direct, vous pouvez mettre à jour n'importe quoi d'autre en une seule ligne sans aucune deuxième instruction de mise à jour pour plus tard, (ex: mettre à jour une colonne de titre avec du texte supplémentaire ou remplacer une chaîne par une autre), vous pouvez également être précis avec quoi exactement vous voulez dupliquer, si tout est alors, si certains, vous pouvez le faire.
la source
INSERT into wp_options SELECT NULL, 'theme_mods_twopress', option_value, autoload FROM wp_options where option_name = 'theme_mods_onepress';
de copier tout en augmentant l'entrée (AUTO_INCREMENT
NULL
astuce d'en haut) et leoption_name
champ également.Je voulais juste étendre la bonne réponse d'Alex pour la rendre appropriée si vous souhaitiez dupliquer un ensemble complet d'enregistrements:
Je devais juste faire cela et j'ai trouvé la réponse d'Alex un point de départ parfait !. Bien sûr, vous devez définir @x sur le numéro de ligne le plus élevé du tableau (je suis sûr que vous pouvez le saisir avec une requête). Ceci n'est utile que dans cette situation très spécifique, donc soyez prudent lorsque vous ne souhaitez pas dupliquer toutes les lignes. Ajustez les calculs si nécessaire.
la source
J'ai un problème similaire, et c'est ce que je fais:
Été Preguntas:
Donc, le
ID
est automatiquement incrémenté et j'utilise également une valeur fixe ('23') pourEncuestaID
.la source
J'en avais besoin aussi; ma solution était d'utiliser SQLYOG (version gratuite) pour exporter l'enregistrement souhaité en SQL (crée une insertion).
J'ai ensuite édité ceci à la main pour supprimer l'identifiant car il doit être généré automatiquement, puis copié l'insert dans SQLYog pour l'exécuter. C'était indolore. Je suppose que de nombreuses autres interfaces graphiques MySQL peuvent également le faire.
Cela me fournit un enregistrement que je peux utiliser à des fins de test sur un système en direct.
J'ai maintenant cet insert pour réutilisation, car le tableau est réécrit quotidiennement.
la source
Légère variation, la principale différence étant de définir le champ de clé primaire ("varname") sur null, ce qui produit un avertissement mais fonctionne. En définissant la clé primaire sur null, l'incrémentation automatique fonctionne lors de l'insertion de l'enregistrement dans la dernière instruction.
Ce code nettoie également les tentatives précédentes et peut être exécuté plus d'une fois sans problème:
la source