314 votes

Comment copier une ligne et d’insérer dans la même table avec un champ autoincrement dans MySQL ?

J’ai une table Eg-tab. Ce que j’essaie de faire est de copier une ligne avec un ID de colonne autoincrement = 1 et insérer les données dans la même table avec un identificateur de ligne et de colonne = 2.

À l’aide de MySql. Comment puis-je faire cela dans une seule requête ? Aider, s'il vous plaît

467voto

mu is too short Points 205090

Utilisation `` :

sont toutes les colonnes sauf . Si vous souhaitez insérer explicitement avec une `` de 2 alors qu’inclure dans votre liste de colonne INSERT et votre sélection :

Vous devrez prendre soin d’un duplicata possible `` de 2 dans le deuxième cas bien sûr.

61voto

parvus Points 1269

OMI, il semble que le meilleur à utiliser des instructions sql à faire une copie de cette ligne, alors que dans le même temps, seulement de référencement sur les colonnes que vous devez et que vous souhaitez modifier.

CREATE TEMPORARY TABLE temp_table ENGINE=MEMORY

SELECT * FROM your_table WHERE id=1;
UPDATE temp_table SET id=NULL; /* Update other values at will. */

INSERT INTO your_table SELECT * FROM temp_table;
DROP TABLE temp_table;

Voir aussi av8n.com - la duplication d'un Enregistrement SQL

Avantages:

  • Les instructions SQL 2 ne citer que les champs qui doivent être modifiés pendant le processus de clonage. Ils ne connaissent pas ou se soucient – les autres champs. Les autres champs suffit de passer le long de la promenade, inchangé. Cela rend les instructions SQL plus facile à écrire, plus facile à lire, facile à entretenir et plus extensible.
  • Seulement ordinaire MySQL états sont utilisés. Pas d'autres outils ou langages de programmation sont nécessaires.
  • Un enregistrement correct est inséré dans your_table en une seule opération atomique.

17voto

Vijay Points 413

Dire que la table est `` .

Vous pouvez utiliser cette requête :

9voto

curmil Points 141

Pour un rapide, propre solution qui ne nécessite pas le nom des colonnes, vous pouvez utiliser une instruction préparée comme décrit ici: http://stackoverflow.com/a/23964285/292677

Si vous avez besoin d'une solution complexe de sorte que vous pouvez le faire souvent, vous pouvez utiliser cette procédure:

DELIMITER $$

CREATE PROCEDURE `duplicateRows`(_schemaName text, _tableName text, _whereClause text, _omitColumns text)
SQL SECURITY INVOKER
BEGIN
  SELECT IF(TRIM(_omitColumns) <> '', CONCAT('id', ',', TRIM(_omitColumns)), 'id') INTO @omitColumns;

  SELECT GROUP_CONCAT(COLUMN_NAME) FROM information_schema.columns 
  WHERE table_schema = _schemaName AND table_name = _tableName AND FIND_IN_SET(COLUMN_NAME,@omitColumns) = 0 ORDER BY ORDINAL_POSITION INTO @columns;

  SET @sql = CONCAT('INSERT INTO ', _tableName, '(', @columns, ')',
  'SELECT ', @columns, 
  ' FROM ', _schemaName, '.', _tableName, ' ',  _whereClause);

  PREPARE stmt1 FROM @sql;
  EXECUTE stmt1;
END

Vous pouvez l'exécuter avec:

CALL duplicateRows('database', 'table', 'WHERE condition = optional', 'omit_columns_optional');

Exemples

duplicateRows('acl', 'users', 'WHERE id = 200'); -- will duplicate the row for the user with id 200
duplicateRows('acl', 'users', 'WHERE id = 200', 'created_ts'); -- same as above but will not copy the created_ts column value    
duplicateRows('acl', 'users', 'WHERE id = 200', 'created_ts,updated_ts'); -- same as above but also omits the updated_ts column
duplicateRows('acl', 'users'); -- will duplicate all records in the table

AVERTISSEMENT: Cette solution n'est que pour quelqu'un qui sera à plusieurs reprises la duplication de lignes dans de nombreux tableaux, souvent. Il pourrait être dangereux dans les mains d'un utilisateur malintentionné.

3voto

Mark Pruce Points 271

Vous pouvez également passer en "0" comme valeur pour la colonne à incrémentation automatique, la valeur correcte sera utilisée lorsque le dossier est créé. C’est tellement plus facile que les tables temporaires.

Source : copie des lignes dans MySQL (voir le second commentaire, par TRiG, pour la première solution, par Lore)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X