Dans MySQL, puis-je copier une ligne à insérer dans le même tableau?
insert into table select * from table where primarykey=1
Je veux juste copier une ligne à insérer dans le même tableau (c'est à dire, je veux dupliquer une ligne existante dans la table), mais je veux le faire sans avoir à la liste de toutes les colonnes après le "select", parce que ce tableau a trop de colonnes.
Mais quand je fais cela, j'obtiens l'erreur:
Entrée en double 'xxx' for key 1
Je peux gérer cela par la création d'une autre table avec les mêmes colonnes, à titre temporaire, un conteneur pour l'enregistrement je veux copier:
create table oldtable_temp like oldtable;
insert into oldtable_temp select * from oldtable where key=1;
update oldtable_tem set key=2;
insert into oldtable select * from oldtable where key=2;
Est-il un moyen plus simple de résoudre ce problème?
- J'ai juste un commentaire à faire sur les valeurs codées en dur pour la clé. Je voudrais faire quelque chose comme
max(oldtable.id) + oldtable_temp.key
de cette façon, je assurez-vous que l'id de l'incrément et sont uniques. - Double Possible de Dupliquer / Copier des enregistrements de la même table MySQL
- cela a plus de réponses et plus de points de vue que cette question
Vous devez vous connecter pour publier un commentaire.
J'ai utilisé Leonard Challis technique avec quelques modifications:
Comme une table temporaire, il ne devrait jamais y avoir plus d'un enregistrement, de sorte que vous n'avez pas à vous soucier de la clé primaire. Le paramètre null MySQL permet de choisir la valeur elle-même, donc il n'y a aucun risque de créer un doublon.
Si vous voulez être super assurer que vous obtenez seulement une ligne à insérer, vous pouvez ajouter 1 à la fin de la plaquette EN ligne.
Noter que j'ai également ajouté de la valeur de la clé primaire (1 dans ce cas) à mon nom de la table temporaire.
tmptable_1
vstmptable
)primarykey
INT NULL; après la première ligne pour faire la solution de travailid = NULL
, utilisezSET SQL_SAFE_UPDATES = 0;
avant l'instruction de mise à jour pour le désactiver puisSET SQL_SAFE_UPDATES = 1;
directement après pour l'activer de nouveau.Mise à jour 07/07/2014 - La réponse repose sur de ma réponse, par Sombre..., est une meilleure solution, car cela améliore ma solution ci-dessous, je vous suggère d'utiliser cela.
Vous pouvez le faire sans faire une liste de toutes les colonnes avec la syntaxe suivante:
Vous pouvez décider de modifier la clé primaire d'une autre manière.
tmptable
, vous n'avez pas besoin d'ajouter de laWHERE primarykey = 2
déclaration pour la dernière ligne trop. (I. e., justeINSERT INTO table SELECT * FROM tmptable
.)Je suis en supposant que vous voulez que l'enregistrement d'un nouveau
primarykey
? Siprimarykey
estAUTO_INCREMENT
puis il suffit de faire ceci:...où
col1, col2, col3, ...
est toutes les colonnes dans la table sauf pourprimarykey
.Si ce n'est pas une
AUTO_INCREMENT
colonne et vous voulez être en mesure de choisir la nouvelle valeur deprimarykey
c'est la même chose:...où
567
est la nouvelle valeur pourprimarykey
.Vous avez presque eu avec votre première requête que vous avez juste besoin de spécifier les colonnes, de cette façon, vous pouvez exclure de votre clé primaire dans l'encart qui mettra en œuvre l'auto-incrémentation il est probable que vous avez sur la table pour créer automatiquement une nouvelle clé primaire pour l'entrée.
Par exemple de changer cela:
À ceci:
Il suffit de ne pas inclure la colonne primarykey dans la liste des colonnes de la plaquette ou pour le SÉLECTIONNER des parties de la requête.
insert into table ("val1", col2, col3) select col2, col3 from table where primarykey = 1
ou quelque chose de similaire?Vous pouvez également essayer de dumping de la table, la conclusion de la commande d'insertion et édition:
La
--skip-extended-insert
vous donne un insert de commande par ligne. Vous pouvez ensuite trouver la ligne dans votre éditeur de texte favori, extrait de la commande et de modifier la clé primaire de "par défaut".Cette procédure suppose que:
Bien sûr, ce n'est pas parfait, mais dans certains (probablement la majorité) des cas, il fonctionne.
works
mais l'approche est solide, et est de valeur parce qu'elle est unique et ne fait l'adresse de l'OP de la question.Si votre table, champ de clé primaire est un auto incrément domaine, alors vous pouvez utiliser la requête avec des colonnes. Par exemple, votre table nommée
test_tbl
a 3 champs commeid, name, age
.id
est un champ de clé primaire et de l'incrément automatique, de sorte que vous pouvez utiliser la requête suivante pour dupliquer la ligne:Présente les résultats de la requête dans la duplication de chaque ligne.
Si votre table est un champ clé primaire n'est pas un auto incrément domaine, alors vous pouvez utiliser la méthode suivante:
Le résultat de cette requête est une double rangée de
id=19
inséré commeid=20
.tableName
(fieldName1
,fieldName2
,fieldName3
) SÉLECTIONNEZfieldName1
,fieldName2
,fieldName3
DEtableName
OÙ 1 (pour copier toutes à la fois)Ceci peut être réalisé avec un peu de créativité:
Cela se traduira dans la nouvelle ligne d'obtenir une auto incrémenté id au lieu de l'id de la ligne sélectionnée.
Partie, les éléments suivants ont été glanées sur ce site. C'est ce que j'ai fait pour dupliquer un enregistrement dans une table avec un certain nombre de domaines:
Cela suppose également que vous avez une IA de terrain au début de la table
clone ligne avec mise à jour des champs et de l'auto incrémentation de la valeur
Je pourrais être en retard dans ce domaine, mais j'ai une solution similaire qui a fonctionné pour moi.
De cette façon, je n'ai pas besoin de créer une table temporaire et etc. Comme la ligne est copié dans le même tableau la
Max(PK)+1
fonction peut être utilisée facilement.Je suis venu chercher la solution de cette question (il avait oublié la syntaxe) et j'ai fini par faire ma propre requête. C'est drôle comment les choses fonctionnent parfois.
Ce qui concerne
Si la Clé Primaire est Incrément Automatique, il suffit de le préciser à chaque champ, à l'exception de la clé primaire.
INSERT INTO table(field1,field2,field3)
SELECT (field1,field2,field3) FROM table
WHERE primarykey=1
J'ai mis à jour @LeonardChallis la solution car il ne fonctionne pas pour moi comme les autres. J'ai enlevé le
WHERE
clauses etSET primaryKey = 0
dans le temp de table afin de MySQL auto-incrémente lui-même primaryKeyC'est bien entendu à double tous les lignes de la table.
Je voudrais utiliser ci-dessous,
J'ai utilisé dans mon base de données Koha pour insérer des éléments en double avec le 'C' préfixe dans code-barres colonne:
J'ai juste eu à le faire et que c'était ma solution manuelle:
Si vous ne savez pas ce que le PRIMAIRE champ, regarder en arrière à votre phpmyadmin page, cliquez sur le 'Structure' et l'onglet au bas de la page, sous 'Index' il va vous montrer ce qui 'Champ' a un 'Keyname' valeur 'PRIMAIRE'.
Genre d'un long chemin, mais si vous ne voulez pas avoir affaire avec le balisage et juste besoin de dupliquer une ligne unique là vous allez.
J'ai utilisé Sombre de la technique avec un peu de changement: Si quelqu'un à la recherche de cette requête est parce que ne peut pas faire une simple requête en raison de clé primaire problème:
Avec mon installation de MySql 5.6.26, la clé n'est pas les valeurs null et produire une erreur:
Donc après avoir créer une table temporaire-je changer la clé primaire d'un être nullable.
Cette solution a montré ci-dessus fonctionne parfait aussi pour les lignes sélectionnées. Par exemple je suis la création de démonstration de lignes pour mon nice2work projet, et cela fonctionne parfaitement.
Désolé pour le necropost mais c'est ce que j'ai tourné avec des google et depuis, j'ai trouvé ce utile mais un problème j'ai voulu contribuer à une modification importante pour quelqu'un d'autre qui creuse cette.
Tout d'abord, je suis l'aide de SQL Serveur, MySQL, mais je pense que cela devrait fonctionner de la même façon. J'ai utilisé Leonard Challis solution parce que c'était plus simple et répondait à la nécessité, cependant, il ya un problème avec ce - si vous prenez simplement la PK et de l'incrémenter de 1 puis ce qui se passe si vous avez ajouté d'autres dossiers depuis la ligne en question a été ajoutée. J'ai décidé qu'il était préférable de laisser le système gérer la autoincrementing de la PK, j'ai donc fait la suivante:
Je crois que ce serait le travail de la même façon dans MySQL, mais je ne peux pas tester, désolé
Je sais que c'est une vieille question, mais voici une autre solution:
Cela duplique une ligne dans la table principale, en supposant que la clé primaire auto-incrémentée, et crée des copies de tableaux de données avec la nouvelle table principale id.
D'autres options pour obtenir les noms des colonnes:
-AFFICHER les COLONNES DE
tablename
; (nom de la Colonne: Champ)-DÉCRIRE
tablename
(nom de la Colonne: Champ)-SÉLECTIONNEZ column_name DE information_schema.les colonnes OÙ table_name = 'nom de la table' (nom de la Colonne: column_name)
max233 était certainement sur la bonne voie, au moins pour l'auto-incrémentation cas.
Toutefois, ne faisons pas de l'instruction ALTER TABLE. Il suffit de définir les auto-incrément de domaine dans l'
table temporaire à NULL. Il s'agit là d'une erreur, mais l'INSERTION suivante de
tous les champs dans la table temporaire qui va arriver et le NULL auto champ d'obtenir
une valeur unique.
Créer une table
Insérer une ligne
Clone de ligne insérer au-dessus de
Test
Voici une réponse que j'ai trouvé en ligne sur ce site
Décrit ci-dessusUn
Vous pouvez trouver la réponse dans le bas de la page. Fondamentalement, ce que vous avez à faire est de copier la ligne à copier dans une table temporaire en mémoire. Ensuite, vous modifiez la Clé Primaire nombre à l'aide de mise à jour. Vous puis réinsérez-la dans la table cible. Ensuite, vous supprimez la table.
C'est cette partie du code:
J'ai créé la table temporaire rescueteam. J'ai copié la ligne de ma table d'origine fitnessreport4. J'ai ensuite mis la clé primaire de la ligne dans la table temporaire à null pour que je puisse la copier à la table d'origine sans avoir une erreur de Clé en Double. J'ai essayé ce code hier soir et cela a fonctionné.
Voulais juste poster mon morceau de code PHP, parce que je pense que la façon dont je collectionne les colonnes est un peu plus propre dans le code que dans les exemples précédents. Cela montre aussi comment vous pouvez facilement modifier un champ, dans ce cas, l'ajout d'une chaîne de caractères. Mais vous pouvez aussi remplacer un champ de clé étrangère avec l'enregistrement nouvellement ajouté, dans le cas où vous souhaitez copier des enregistrements enfants ainsi.
D'une solution très simple, vous pouvez utiliser PHPMyAdmin pour l'exportation de la ligne sous la forme d'un fichier CSV, puis il suffit d'importer la version modifiée de fichier CSV. L'édition de l'ID/primarykey colonne de ne montrent pas de valeur avant de l'importer.
Puis au bas de la page:
Où est dit "à l'Exportation" il suffit d'exporter, puis éditer le fichier csv pour supprimer les clés primaires de la valeur, il est donc vide, et puis il suffit de l'importer dans la base de données, un nouveau primarykey sera attribué lors de l'importation.