Вопрос касается только SQL. Есть две сущности: проекты и шаблоны.
Старая структура: все проекты могли использовать любой из шаблонов. Но в конкретный момент естественно только один.
Там две таблицы:
projects -> id, title, template_id
templates -> id, title
Новая структура: у каждого проекта должен быть свой собственный набор шаблонов. Активным может быть только один шаблон из «личного» набора.
Теперь нужны три таблицы:
new_projects -> id, title, current_template_id
new_templates -> id, title (, old_id)
new_projects_templates -> project_id, template_id
Некоторые проекты используют одинаковые шаблоны. Первым шагом я «размножил» шаблоны и перебил им автоинкрементные айдишники. Однако, временно сохранил old_id, поэтому он и указан в скобочках, ведь после всех манипуляций я удалю это поле через ALTER TABLE.
Вот запрос втыкающий «размноженный» результат в новую табулю шаблонов:
SET @cnt := 0;
INSERT INTO new_templates (
SELECT
(@cnt := @cnt + 1) id,
sub.title,
sub.old_id
FROM (
SELECT
t.title,
t.id old_id
FROM templates t
LEFT JOIN projects p
ON p.template_id = t.id
WHERE p.id IS NOT NULL -- кастыль для шаблонов без привязки к проектам
ORDER BY t.id ASC -- чтобы вставка была в старом порядке создания шаблонов
) sub
);
Вот так выглядит попытка тестовой выборки:
-- счетчик не сброшен
-- в нем максимальный айдишник после вставки
-- теперь декрементируем его
SELECT
(@cnt := @cnt - 1),
p.id project_id,
nt.old_id nt_old_id,
nt.id nt_id
FROM projects p -- из старой таблицы проектов
LEFT JOIN new_templates nt -- из новой таблицы шаблонов
ON nt.id = @cnt