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é.