LINUX.ORG.RU

Миграция на новую структуру БД

 , ,


0

1

Вопрос касается только 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
);
Ну а теперь никак не сообразу как запилить еще два шага: 2) вставка проектов в новую таблицу проектов с корректной привязкой к шаблону. 3) вставка в таблицу связи проекты-шаблоны.

Вот так выглядит попытка тестовой выборки:

-- счетчик не сброшен
-- в нем максимальный айдишник после вставки
-- теперь декрементируем его
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
Естессно выдает он полную хрень. Как правильно то запилить?

Как, и главное нафига?!?!?!

Почему нельзя было просто создать таблицу projects_templates и заполнить её из SELECT-запроса вида «projects LEFT JOIN templates», туда же размесить и признак current, чтобы не создавать неоднозначности?

r_asian ★☆☆
()
Ответ на: комментарий от r_asian

И какая разница куда втыкать «current»-признак? Что в new_projects, что в new_templates - нужно именно размножить одни и те же шаблоны по проектам и обновить привязку по айдишникам.

deep-purple ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.