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 le tableau) mais je veux le faire sans avoir à lister toutes les colonnes après le "select", car ce tableau a trop de colonnes.
Mais quand je fais cela, j'obtiens l'erreur:
Entrée dupliquée 'xxx' pour la clé 1
Je peux gérer cela en créant une autre table avec les mêmes colonnes qu'un conteneur temporaire pour l'enregistrement que je souhaite 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;
Existe-t-il un moyen plus simple de résoudre ce problème?
mysql
copy
duplicates
row
lina
la source
la source
max(oldtable.id) + oldtable_temp.key
ça, je m'assure que les identifiants augmentent et sont uniques.Réponses:
J'ai utilisé la technique de Leonard Challis avec quelques modifications:
En tant que table temporaire, il ne devrait jamais y avoir plus d'un enregistrement, vous n'avez donc pas à vous soucier de la clé primaire. Le définir sur null permet à MySQL de choisir la valeur elle-même, il n'y a donc aucun risque de créer un doublon.
Si vous voulez être sûr de n'avoir qu'une seule ligne à insérer, vous pouvez ajouter LIMIT 1 à la fin de la ligne INSERT INTO.
Notez que j'ai également ajouté la valeur de clé primaire (1 dans ce cas) à mon nom de table temporaire.
la source
tmptable_1
vs.tmptable
)primarykey
INT NULL; après la première ligne pour faire fonctionner la solutionMise à jour 07/07/2014 - La réponse basée sur ma réponse, par Grim ... , est une meilleure solution car elle améliore ma solution ci-dessous, donc je suggère de l'utiliser.
Vous pouvez le faire sans lister toutes les colonnes avec la syntaxe suivante:
Vous pouvez décider de changer la clé primaire d'une autre manière.
la source
tmptable
, vous n'avez pas besoin d'ajouter l'WHERE primarykey = 2
instruction pour la dernière ligne. (Ie, justINSERT INTO table SELECT * FROM tmptable
.)Je suppose que vous voulez que le nouvel album ait un nouveau
primarykey
? Siprimarykey
c'est le cas,AUTO_INCREMENT
faites ceci:... où
col1, col2, col3, ...
se trouvent toutes les colonnes du tableau à l' exception deprimarykey
.Si ce n'est pas une
AUTO_INCREMENT
colonne et que vous voulez pouvoir choisir la nouvelle valeur carprimarykey
elle est similaire:... où
567
est la nouvelle valeur pourprimarykey
.la source
Vous l'avez presque eu avec votre première requête, il vous suffit de spécifier les colonnes, de cette façon, vous pouvez exclure votre clé primaire dans l'insertion qui déclenchera l'incrémentation automatique que vous avez probablement sur la table pour créer automatiquement une nouvelle clé primaire pour le entrée.
Par exemple changez ceci:
Pour ça:
N'incluez simplement pas la colonne de clé primaire dans la liste des colonnes pour INSERT ou pour les parties SELECT de la requête.
la source
insert into table ("val1", col2, col3) select col2, col3 from table where primarykey = 1
ou quelque chose de similaire?Vous pouvez également essayer de vider la table, trouver la commande d'insertion et la modifier:
Le
--skip-extended-insert
vous donne une commande d'insertion par ligne. Vous pouvez ensuite trouver la ligne dans votre éditeur de texte préféré, extraire la commande et modifier la clé primaire sur "default".la source
Cette procédure suppose que:
Bien sûr, ce n'est pas parfait, mais dans certains cas (probablement la plupart) cela fonctionnera.
la source
works
mais l'approche est solide et a de la valeur car elle est unique ici et répond en fait à la question du PO.Ceci peut être réalisé avec une certaine créativité:
Cela aura pour résultat que la nouvelle ligne obtiendra un identifiant incrémenté automatiquement au lieu de l'identifiant de la ligne sélectionnée.
la source
Si le champ de clé primaire de votre table est un champ à incrémentation automatique, vous pouvez utiliser une 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 incrémenté automatiquement, vous pouvez donc utiliser la requête suivante pour dupliquer la ligne:Cette requête entraîne la duplication de chaque ligne.
Si le champ de clé primaire de votre table n'est pas un champ à incrémentation automatique, vous pouvez utiliser la méthode suivante:
Le résultat de cette requête est une ligne dupliquée d'
id=19
inséré en tant queid=20
.la source
tableName
(fieldName1
,fieldName2
,fieldName3
) SELECTfieldName1
,fieldName2
,fieldName3
DEtableName
OU 1 (à copier tous à la fois)ligne de clonage avec champs de mise à jour et valeur d'incrémentation automatique
la source
Certains des éléments suivants ont été glanés sur ce site. Voici ce que j'ai fait pour dupliquer un enregistrement dans une table avec un nombre quelconque de champs:
Cela suppose également que vous ayez un champ AI au début de la table
la source
J'ai utilisé la technique de Grim avec un petit changement: si quelqu'un recherchant cette requête est parce qu'il ne peut pas faire une requête simple en raison d'un problème de clé primaire:
Avec mon installation MySql 5.6.26, la clé n'est pas nullable et génère une erreur:
Donc, après avoir créé une table temporaire, je change la clé primaire en une valeur nullable.
la source
Je suis peut-être en retard, 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, etc. Comme la ligne est copiée dans la même table,
Max(PK)+1
fonction peut être utilisée facilement.Je suis venu chercher la solution de cette question (j'avais oublié la syntaxe) et j'ai fini par faire ma propre requête. C'est drôle comment les choses fonctionnent parfois.
Cordialement
la source
Si la clé primaire est à incrémentation automatique, spécifiez simplement chaque champ à l'exception de la clé primaire.
INSERT INTO table(field1,field2,field3) SELECT (field1,field2,field3) FROM table WHERE primarykey=1
la source
J'ai mis à jour la solution de @ LeonardChallis car elle ne fonctionnait pas pour moi comme aucune des autres. J'ai supprimé les
WHERE
clauses etSET primaryKey = 0
dans la table temporaire pour que MySQL s'incrémente automatiquement le primaryKeyIl s'agit bien sûr de dupliquer toutes les lignes du tableau.
la source
J'utiliserais ci-dessous,
la source
J'ai utilisé dans ma base de données Koha pour insérer des éléments en double avec le préfixe `` C '' dans la colonne du code à barres :
la source
Je devais juste le faire et c'était ma solution manuelle:
Si vous ne savez pas ce qu'est le champ PRIMAIRE , revenez sur votre page phpmyadmin , cliquez sur l' onglet 'Structure' et au bas de la page sous 'Index' il vous montrera quel 'Field' a un 'Keyname' valeur 'PRIMAIRE' .
Un peu loin, mais si vous ne voulez pas gérer le balisage et que vous avez juste besoin de dupliquer une seule ligne, vous y allez.
la source
Cette solution montrée ci-dessus fonctionne parfaitement également pour les lignes sélectionnées. Par exemple, je crée des lignes de démonstration pour mon projet nice2work, et cela fonctionne parfaitement.
la source
Désolé pour le necropost, mais c'est ce que j'ai trouvé avec google et comme j'ai trouvé cela utile mais problématique, je voulais apporter une modification importante pour quiconque déterre cela.
Tout d'abord, j'utilise SQL Server, pas MySQL, mais je pense que cela devrait fonctionner de la même manière. J'ai utilisé la solution de Leonard Challis parce qu'elle était la plus simple et répondait au besoin, mais il y a un problème avec cela - si vous prenez simplement le PK et l'incrémentez de 1, que se passe-t-il si vous avez ajouté d'autres enregistrements depuis que la ligne en question a été ajoutée . J'ai décidé qu'il valait mieux laisser le système gérer l'auto-incrémentation du PK, j'ai donc fait ce qui suit:
Je pense que cela fonctionnerait de la même manière dans MySQL, mais je ne peux pas le tester, désolé
la source
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 est auto-incrémentée, et crée des copies des données des tables liées avec le nouvel identifiant de table principale.
Autres options pour obtenir les noms de colonnes:
-SHOW COLUMNS FROM
tablename
; (Nom de la colonne: Champ)-DESCRIBE
tablename
(Nom de la colonne: Champ)-SELECT nom_colonne FROM schéma_informations.colonnes WHERE nom_table = 'nom_table' (nom de la colonne: nom_colonne)
la source
max233 était certainement sur la bonne voie, du moins pour le cas de l'auto-incrémentation. Cependant, ne faites pas le ALTER TABLE. Définissez simplement le champ d'auto-incrémentation dans la table temporaire sur NULL. Cela présentera une erreur, mais l'INSERT suivant de tous les champs de la table temporaire se produira et le champ automatique NULL obtiendra une valeur unique.
la source
Créer une table
Insérer une ligne
Insertion de ligne de clonage ci-dessus
Tester
la source
Voici une réponse que j'ai trouvée en ligne sur ce site Décrit comment faire ce qui précède 1 Vous pouvez trouver la réponse au bas de la page. En gros, vous copiez la ligne à copier dans une table temporaire conservée en mémoire. Vous modifiez ensuite le numéro de clé primaire à l'aide de la mise à jour. Vous le réinsérez ensuite dans la table cible. Vous déposez ensuite la table.
Voici le code pour cela:
J'ai créé la rescueteam de table temporaire. J'ai copié la ligne de mon tableau de fitnessreport4 d'origine. J'ai ensuite défini la clé primaire de la ligne dans la table temporaire sur null afin de pouvoir la recopier dans la table d'origine sans obtenir une erreur de clé en double. J'ai essayé ce code hier soir et cela a fonctionné.
la source
Ceci est une solution supplémentaire à la réponse de "Grim ..." Il y a eu quelques commentaires sur le fait d'avoir une clé primaire comme null. Certains commentaires à ce sujet ne fonctionnent pas. Et quelques commentaires sur les solutions. Aucune des solutions n'a fonctionné pour nous. Nous avons MariaDB avec la table InnoDB.
Nous n'avons pas pu définir la clé primaire pour autoriser null. L'utilisation de 0 au lieu de NULL entraînait une erreur de valeur en double pour la clé primaire.
SET SQL_SAFE_UPDATES = 0;
Cela n'a pas fonctionné non plus.La solution de "Grim ..." a fonctionné SI nous avons changé notre clé PRIMAIRE en UNIQUE à la place
la source
Je voulais juste publier mon morceau de code PHP, car je pense que la façon dont je collecte les colonnes est un peu plus propre dans le code que les exemples précédents. Cela montre également comment vous pouvez facilement modifier un champ, dans ce cas en ajoutant une chaîne. Mais vous pouvez également remplacer un champ de clé étrangère par l'enregistrement nouvellement ajouté, au cas où vous souhaiteriez également copier certains enregistrements enfants.
la source
Pour une solution très simple, vous pouvez utiliser PHPMyAdmin pour exporter la ligne sous forme de fichier CSV, puis importer simplement le fichier CSV modifié. Modification de la colonne ID / clé primaire pour n'afficher aucune valeur avant de l'importer.
Puis en bas de page:
Où est dit "Exporter", exportez simplement, puis éditez le fichier csv pour supprimer la valeur de la clé primaire, donc c'est vide, puis importez-la simplement dans la base de données, une nouvelle clé primaire sera attribuée lors de l'importation.
la source