ProKiLL
@ProKiLL
Системный администратор

Как разбить таблицу на две в MySQL?

Доброе утро!
Есть таблица представленная ниже (действующая)
CREATE TABLE `id` (
  `id_letter` int(11) NOT NULL AUTO_INCREMENT,
  `in_num` varchar(50) NOT NULL,
  `in_date` date NOT NULL,
  `correspondent` varchar(500) NOT NULL,
  `out_num` varchar(50) NOT NULL,
  `uot_date` varchar(20) NOT NULL,
  `content` varchar(500) NOT NULL,
  `contractor` varchar(50) NOT NULL,
  `isp_date` varchar(20) NOT NULL,
  `label_num` varchar(50) DEFAULT NULL,
  `label_date` varchar(20) DEFAULT NULL,
  `type` varchar(10) DEFAULT NULL,
  `label_mess` varchar(2500) DEFAULT NULL,
  `id_path` varchar(1000) DEFAULT NULL,
  PRIMARY KEY (`id_letter`)
) ENGINE=InnoDB AUTO_INCREMENT=3318567 DEFAULT CHARSET=utf8;


Её необходимо разбить на 2 новые таблицы:
CREATE TABLE `table1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `in_num` varchar(50) NOT NULL,
  `in_date` date NOT NULL,
  `correspondent` varchar(500) NOT NULL,
  `out_num` varchar(50) NOT NULL,
  `uot_date` date NOT NULL,
  `content` varchar(500) NOT NULL,
  `type` int(11) NOT NULL,
  `id_pach` varchar(1000) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1588257 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;

CREATE TABLE `table2` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `id_letter` int(11) NOT NULL,
  `contractor` int(11) NOT NULL,
  `isp_date` datetime DEFAULT NULL,
  `label_num` varchar(50) DEFAULT NULL,
  `label_date` date DEFAULT NULL,
  `label_mess` varchar(2500) DEFAULT NULL,
  `date_1` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


Как это сделать максимально просто?
В первой (действующей) таблице много повторяющихся записей для таблицы table1).
Мои мысли: сформировать table1 по принципу группировки по полям id.in_num и id.in_date - реализовал.
Как заполнить table2 что бы table2.id_letter был равен table1.id не могу понять...
  • Вопрос задан
  • 2161 просмотр
Пригласить эксперта
Ответы на вопрос 1
Stalker_RED
@Stalker_RED
Примерно так

Первая:
INSERT INTO new_table1 (id, in_num, in_date, correspondent, out_num, uot_date, content, type, id_pach) 
SELECT id_letter, in_num, in_date, correspondent, out_num, uot_date, content, type, id_pach FROM old_table
GROUP BY in_num, in_date


Вторая:
INSERT INTO new_table2 (id_letter, contractor, isp_date, label_num, label_date, label_mess, date_1) 
SELECT id as id_letter, contractor, isp_date, label_num, label_date, label_mess, date_1 FROM old_table
GROUP BY ...


И коли уж вы решили заняться рефакторингом, задумайтесь о том, чтобы дать полям вменяемые имена. Скорее всего вы и сами через пару лет с трудом вспомните чем date_1 отличается от uot_date. Не говоря уж о том случае, когда поддержка этого кода достанется другому разработчику.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы