#mysql #merge
#mysql #слияние
Вопрос:
У нас есть MYSQL table of MERGE Storage Engine, которая объединяет данные из 40 таблиц (от «table01» до «table40«). Как только мы запускаем запрос SELECT, мы получаем все записи из всех объединенных таблиц MySQL. Структура и поведение таблицы СЛИЯНИЯ соответствуют ожиданиям.
Однако случается, что нам нужно определить, какая запись строки объединенной таблицы взята из или соответствует какой объединенной таблице, т.е.
- rowA => «table01«
- rowB => «table12«
- rowC => «table12«
- rowD => «table35«
- rowE => «table39«
- строка … => «таблица …«
Есть ли способ сделать это с помощью MySQL MERGE storage engine?
Ответ №1:
Не так элегантно, но вы можете добавить идентифицирующий столбец integer в каждую из ваших таблиц, указать этот столбец со значением по умолчанию 1, 2 (в зависимости от того, какая это таблица — вы даже можете добавить таблицу поиска (tableId —> tableName), и тогда вы сможете определить, из какой таблицыв таблицу попала заданная строка.
Конечно, вам также придется внести те же изменения в таблицу слияния…
С любовью сорвал документы СЛИЯНИЯ MySQL:
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,message CHAR(20)) ENGINE=MyISAM;
CREATE TABLE t2 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,message CHAR(20)) ENGINE=MyISAM;
INSERT INTO t1 (message) VALUES ('Testing'),('table'),('t1');
INSERT INTO t2 (message) VALUES ('Testing'),('table'),('t2');
CREATE TABLE total (a INT NOT NULL AUTO_INCREMENT,message CHAR(20),INDEX(a)) ENGINE=MERGE UNION=(t1,t2) INSERT_METHOD=LAST;
alter table t1 add column identifier int unsigned not null default 1;
alter table t2 add column identifier int unsigned not null default 2;
drop table total;
CREATE TABLE total (a INT NOT NULL AUTO_INCREMENT,message CHAR(20),identifier int unsigned,INDEX(a)) ENGINE=MERGE UNION=(t1,t2) INSERT_METHOD=LAST;
Однако у вас будет довольно скучная задача по изменению всех 40 таблиц…
Комментарии:
1. Просто обратите внимание, что для повышения эффективности обычно было бы лучше использовать целое число вместо строки.