Как перенести данные из одной таблицы, сохранив связи

Рейтинг: 0Ответов: 1Опубликовано: 29.04.2023

В общем есть одна большая таблица, ее разделили на несколько для удобства и построили реляции. Теперь нужно перенести данные из этой большой таблицы в остальные, но нужно сохранить связь между данными, раньше в одной таблице связь данных была благодаря тому, что все данные хранились вместе, но так как были созданы новые таблицы, то и были созданы Primary Key и Foreign Keys, если просто переносить с помощью INSERT то получится, что связи потеряются.

Ответы

▲ 1Принят

Пример переноса.

Исходная таблица. id - синтетика, и сохранения не требует.

CREATE TABLE source (
  id INT AUTO_INCREMENT PRIMARY KEY,  -- не сохраняем
  grp INT, 
  val INT
  );
INSERT INTO source VALUES
(1,1,1),
(3,1,2),
(6,1,3),
(7,2,4),
(2,2,5),
(4,2,6);
SELECT * FROM source;
id grp val
1 1 1
2 2 5
3 1 2
4 2 6
6 1 3
7 2 4

Переносим main-данные.

CREATE TABLE main_group (
  grp_id INT AUTO_INCREMENT PRIMARY KEY,
  grp INT
  ) AUTO_INCREMENT = 10;
INSERT INTO main_group (grp)
SELECT DISTINCT grp
FROM source;
SELECT * FROM main_group;
grp_id grp
10 1
11 2

Переносим slave-данные, используем связывание для получение нового значения ключа.

CREATE TABLE slave_value (
  val_id INT AUTO_INCREMENT PRIMARY KEY,
  grp_id INT,
  val INT,
  FOREIGN KEY (grp_id) REFERENCES main_group (grp_id)) AUTO_INCREMENT = 20;
INSERT INTO slave_value (grp_id, val)
SELECT main_group.grp_id, source.val
FROM source
JOIN main_group USING (grp);
SELECT * FROM slave_value;
val_id grp_id val
20 10 1
21 11 5
22 10 2
23 11 6
24 10 3
25 11 4

Проверяем соответствие исходных данных и результата.

SELECT grp, val FROM source ORDER BY 1,2;

SELECT main_group.grp, slave_value.val
FROM main_group
JOIN slave_value USING (grp_id) ORDER BY 1,2;
grp val
1 1
1 2
1 3
2 4
2 5
2 6
grp val
1 1
1 2
1 3
2 4
2 5
2 6

fiddle