MySQL - копирование данных таблицы в неидентичную таблицу - PullRequest
0 голосов
/ 07 ноября 2011

Допустим, у меня есть две таблицы схожей структуры, но одна пуста, а другая содержит несколько строк информации:

table1

col1 | col2 | col3
red  | cow  | 1
blue | dog  | 2
gray | pig  | 3

table2

col1 | col2 | col3 | col4

table3

col1 | col2

Попытка:

insert into `table2` select * from `table1`

не будет работать из-за несоответствующего числа столбцов, и то же самое верно, если подставить table3 для table2.

Изменение части * оператора SELECT не является опцией для динамических целей.Таким образом, обходной путь должен быть модифицированным SELECT, объединяющим информацию.

Есть ли оператор JOIN или что-то такое, что объединит структуры таблиц и данных так, чтобы это выглядело так:

select * from `table1`,`table2` (JOIN or some other statement)
col1 | col2 | col3 | col4
red  | cow  | 1    | NULL
blue | dog  | 2    | NULL
gray | pig  | 3    | NULL

select * from `table1`,`table3` (JOIN or some other statement)
col1 | col2
red  | cow
blue | dog
gray | pig

В основном просто объединение любых столбцов с одинаковыми именами и аннулирование внешних совпадений.Опять же, он не может ссылаться на конкретные имена столбцов, чтобы сохранить динамичность.Это кажется выполнимым, но я не могу найти ответ.

Огромное спасибо всем, кто может помочь.

Ответы [ 2 ]

1 голос
/ 07 ноября 2011

Если целевая таблица INSERT является подмножеством исходной таблицы, как в вашем примере, то существует простое решение:

insert into table2(col1, col2, col3)
select *
from   table1;

Или, если первые столбцы обеих таблиц расположены в том же порядке, как в вашем примере, тогда ваш опубликованный запрос должен действительно работать:

insert into table2 select * from table1;

Я цитирую руководство для версии 5.6 по этому вопросу:

Если вы не работаете в режиме строгого SQL, любой столбец не является явным заданное значение устанавливается в значение по умолчанию (явное или неявное). За Например, если указать список столбцов, в котором не указаны все столбцы в таблице, для безымянных столбцов установлены значения по умолчанию. Назначение значений по умолчанию описано в Разделе 10.1.4, «Тип данных». Значения по умолчанию". См. Также Раздел 1.8.6.2, «Ограничения на недействительных Данные».

Однако почти всегда плохая идея полагаться на «SELECT *» в операции INSERT. Итак, несмотря на ваш запрос, оно действительно должно быть:

insert into table2(col1, col2, col3)
select col1, col2, col3
from   table1;

Для чего-то большего вам придется использовать DESCRIBE tablex и динамически создавать запросы.

0 голосов
/ 07 ноября 2011

Вы можете разрешить нулевые значения для столбцов, которые в конечном итоге будут исключены.

insert into `table2` (col1, col2, col3) select col1, col2, col3 from `table1`

также могут быть вам полезны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...