Пример переноса.
Исходная таблица. 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;
Переносим 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