SQL миграция - переместить данные в другую таблицу и получить первичный ключ - PullRequest
0 голосов
/ 26 мая 2020

Проблема

Предположим, что таблица выглядит так:

CREATE TABLE parent (
  parent_id INTEGER PRIMARY KEY,
  col1 REAL,
  col2 REAL
);

Затем требования системы меняются и parent требует наличия информации col1 и col2 на двух разные моменты времени. Одним из возможных вариантов может быть создание отдельной таблицы для col1 и col2:

CREATE TABLE child (
  child_id INTEGER PRIMARY KEY,
  col1 REAL,
  col2 REAL
);

CREATE TABLE parent (
  parent_id INTEGER PRIMARY KEY,
  current_child INTEGER,
  previous_child INTEGER,
  FOREIGN KEY (current_child) REFERENCES child (child_id),
  FOREIGN KEY (previous_child) REFERENCES child (child_id)
);

вопросов

  1. Есть ли способ создать миграцию SQL сценарий для перемещения данных из исходной таблицы parent в child и установки правильного внешнего ключа в current_child?

    • previous_child может изначально оставаться пустым, это не проблема.
    • Меня пока не волнует удаление столбцов col1 и col2 из parent .
    • Я избегаю использования вспомогательных скриптов на других языках (например, в Python), чтобы упростить процесс миграции.
  2. Есть ли лучшая альтернатива дизайна?

    • Я мог бы просто добавить два новых столбца previous_col1 и previous_col2, но в реальном сценарии у меня гораздо больше столбцов.

PS: Вероятно, уместно знать, что я использую SQLite.

Update

@Felix.leg задал отличный вопрос, и я заметил, что я застрял с идеей всегда используя автоматически сгенерированные значения PK для обеих таблиц. Правда в том, что child_id можно определить из parent_id:

  • current_child = 2 * parent_id - 1
  • previous_child = 2 * parent_id

При таком подходе я полагаю, что можно было бы написать единственный SQL сценарий миграции для создания новой таблицы, перемещения данных и установки правильных значений внешнего ключа.

...