PHP MySQL, Copier une ligne de la même table... avec un Primaire et de clé Unique
Ma table a deux clés, l'une est une auto-incrémentation de l'id (PRIMAIRE), l'autre est le nom de l'élément (UNIQUE).
Est-il possible de dupliquer une ligne à l'intérieur de cette même table? J'ai essayé:
INSERT INTO items
SELECT * FROM items WHERE id = '9198'
Cela donne l'erreur Duplicate entry '9198' for key 'PRIMARY'
J'ai aussi essayé:
INSERT INTO items
SELECT * FROM items WHERE id = '9198'
ON DUPLICATE KEY UPDATE id=id+1
Qui donne l'erreur Column 'id' in field list is ambiguous
Et aussi loin que le nom de l'élément (UNIQUE) de terrain va, est-il un moyen d'ajouter (Copy)
du nom de l'élément, puisque ce champ doit également être unique?
Essayez de sélectionner toutes les lignes à l'exception de l'id, en supposant que votre id est en auto increment, il se mettra à jour automatiquement.
Que serait le travail, mais je suis à la recherche d'une autre méthode, que ce tableau a quelques centaines de colonnes.
Copiez et collez les noms de colonne.
quelques centaines de colonnes? Ça doit être l'enfer à gérer pour autant de colonnes dans une table unique!
vous POUVEZ interroger les noms de colonne à l'aide de "SELECT GROUP_CONCAT(nom_colonne) à PARTIR de information_schema.les colonnes OÙ table_name = 'articles' et column_name <> 'id'"
Que serait le travail, mais je suis à la recherche d'une autre méthode, que ce tableau a quelques centaines de colonnes.
Copiez et collez les noms de colonne.
quelques centaines de colonnes? Ça doit être l'enfer à gérer pour autant de colonnes dans une table unique!
vous POUVEZ interroger les noms de colonne à l'aide de "SELECT GROUP_CONCAT(nom_colonne) à PARTIR de information_schema.les colonnes OÙ table_name = 'articles' et column_name <> 'id'"
OriginalL'auteur Norse | 2012-07-26
Vous devez vous connecter pour publier un commentaire.
Sélectionnez toutes les colonnes explicitement, à l'exception de la colonne id:
Votre prochaine question sera probablement:
Réponse: Non, je ne le pense pas.
OriginalL'auteur Mark Byers
Si vous vraiment ne veux pas la liste de toutes les colonnes de la table comme dans la Marque de la réponse, vous pouvez essayer ceci:
Pas beau, pas rapide. Mais les œuvres.
Cet exemple a fonctionné pour moi. J'ai juste fait en sorte que lorsque je l'ai utilisé avec plusieurs utilisateurs, que j'ai ajouté une pièce supplémentaire à la temp_tbl, de sorte qu'il était unique pour l'utilisateur. J'ai également ajouté la ligne suivante: mise à JOUR temp_tbl ENSEMBLE field_that_needs_to_use_a_title = CONCAT('DOUBLE ',field_that_needs_to_use_a_title) where id = '9198';
OriginalL'auteur Phius
Alternativement, si vous ne voulez pas écrire toutes les colonnes explicitement (et ne veux pas commencer la création/suppression des tables), vous pouvez juste obtenir les colonnes de la table et de construire la requête automatiquement:
Remarque que cela utilise la amortis code de MySQL et il devrait être MySQLi. Je suis sûr qu'il pourrait également être améliorée, mais c'est ce que j'utilise et ça fonctionne très bien.
OriginalL'auteur hobailey
Grâce à hobailey de fournir un grand entretien sans solution.
Voici le code que j'ai fini par utiliser, qui est mis à jour pour MySQLi:
$mysqli->real_escape_string($r[$col])
est nécessaire d'examiner les valeurs sont déjà dans la base de données?Oui échapper nécessaire de l'essayer avec des citations dans le texte - ou utiliser PDO /lié params
OriginalL'auteur Mark
La question titre ne fait état que vous voulez faire à partir de PHP.
J'ai rencontré le même problème et écrire tous les noms de colonnes est fastidieux et difficile à maintenir si vous modifiez votre structure de la table (ajouter/supprimer des colonnes)... et je n'aime pas les solutions qui utilisent des tables temporaires.
J'ai choisi de résoudre ce problème avec deux requêtes envoyées à partir de PHP fonctionne très bien et ne nécessite aucun entretien (disclaimer: j'utilise la meekrodb de la bibliothèque pour l'accès de base de données):
Vous pouvez même effectuer plusieurs manipulations sur les données internes (unset les autres colonnes de l'ignorer, de modifier des valeurs, etc...) avant de ré-insertion.
OriginalL'auteur Olivier
Une autre solution dans PHP pour copier une ligne dans le même tableau, sans une colonne spécifique(s) /exemple: clé primaire - et sans "TABLE TEMPORAIRE" et "AFFICHER les COLONNES à PARTIR de..."-méthode:
L'INSERT SELECT-déclaration, de sorte que les valeurs ne sont pas directement dans la déclaration --> pas de problèmes avec les "real_escape_string" ou quelque chose comme ça.
OriginalL'auteur Oliver-xx
Pour les tables avec de nombreuses colonnes, j'utilise un (oui, lent) méthode similaire à Phius idée.
Je le mets ici juste pour être complet.
Supposons, la table "tbl' a un 'id' défini comme
Alors vous pouvez dupliquer/copier une ligne en suivant ces étapes:
Si vous avez besoin d'clone/copie charge des données dans d'autres tableaux, le faire ci-dessus
pour chaque ligne. Après l'étape 6, vous pouvez obtenir la dernière inséré la clé et l'utiliser pour
clone/copie à la charge des lignes au sein d'autres tables à l'aide de la même procédure.
OriginalL'auteur rockdaboot
Je suis surpris de voir quelqu'un de ne pas mentionner l'aide de phpMyAdmin pour créer la requête. Parce que ce serait faire rapidement pour ajouter toutes les colonnes et alors que vous venez de définir l'identifiant de la valeur null ou o comme mentionné ci-dessus par wlf.
C'est de loin la façon la plus simple de le faire
OriginalL'auteur The Amerloc
Dire que la table est
user(id,email,user)
et parce que vous avez unWHERE
clause, vous ne pouvez pas utiliserMAX(id)+1
:Garder à l'esprit que vous devez toujours spécifier les noms de colonne lors de l'utilisation d'INSERTION.
OriginalL'auteur wlf
Je voulais copier une ligne dans mon tableau des événements et a trouvé la Marque, solution très utile. Je l'ai fait un peu plus courte.
et le code pour copier:
OriginalL'auteur Paul Wolbers
Cette fonction pour copier un enregistrement d'une table:
ne pouvez pas supprimer ce deuxième commentaire - j'ai besoin de sauts de ligne au-dessus
OriginalL'auteur MrCatGonzo