how to duplicate each row of a mysql table?

Posted on

Question :

I’ve got a table of Product records from an old db that I must change to import on a new php system. They have the form:

name, property1_IT, property1_EN, property1_FR

I need to transform them by duplicating each row and change it like:

name, language, property1

where property1 will have the related translated value.

In other words, I’ll need one row for each product translation, thus adding a language column and deleting the property translation fields.

Is it possible with sql or should I just use php to cicle through the records and doing the duplication tasks?

Answer :

You can do it like this:

create new_table as
select name, 'italian' as language, property1_IT as property1 from old_table
union all
select name, 'english' as language, property1_EN as property1 from old_table
union all
select name, 'french' as language, property1_FR as property1 from old_table;

A a compendium to @tombom’s answer, I’d like to add the fact that if the table has a lot of fields (as in my case) and field order is not a problem, another approach can be to simply add translations after all the other fields, and then delete the old translation ones. So, first:

CREATE TABLE `V36_test` AS

SELECT
  *,
  'IT' AS LANGUAGE,
  XLS_TIPO_IMPUGNATURA_IT AS XLS_TIPO_IMPUGNATURA,
  XLS_ROTAZIONE_IT AS XLS_ROTAZIONE,
  [etc...]
FROM OLD_TABLE

UNION ALL
SELECT
    *,
    'EN' AS LANGUAGE,
    XLS_TIPO_IMPUGNATURA_EN as XLS_TIPO_IMPUGNATURA,
    XLS_ROTAZIONE_EN as XLS_ROTAZIONE,
    [etc...]
FROM OLD_TABLE

[etc.. other languages...]

Then:

ALTER TABLE V36_test DROP COLUMN XLS_TIPO_IMPUGNATURA_IT;
ALTER TABLE V36_test DROP COLUMN XLS_ROTAZIONE_IT;
[etc...]
ALTER TABLE V36_test DROP COLUMN XLS_TIPO_IMPUGNATURA_EN;
ALTER TABLE V36_test DROP COLUMN XLS_ROTAZIONE_EN;
[etc...]

With a smart, multi-line code editor like Sublime Text, it’s very easy and fast to write a query like this even with a lot more fields.

Leave a Reply

Your email address will not be published. Required fields are marked *