Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 1
Добрый день/вечер/утро всем.
Проблема следующая. Имеются две таблицы: в одной активные сделки, во второй архив.
Таблицы отличаются только одним полем - в архивной имеется id архивной записи.
Как можно перенести все записи из 1-й таблицы во вторую?
Набор полей table_arch
id_arch, id_act, pole1, pole2
Набор полей table_act
id_act, pole1, pole2
Уже работает следующая команда:
INSERT INTO table_arch select '', pole1, pole2 from table_act
Но т.к. в реальности количество полей гораздо больше - вопрос: существует ли более короткое/красивое решение типа:
INSERT INTO table_arch select '', * from table_act
(к сожалению этот вариант выдает ошибку и просит проверить синтаксис
Спасибо.
Отредактированно TheVeter (05.02.2014 00:05:28)
Неактивен
INSERT INTO table_arch (id_act, pole1, pole2) select * from table_act
Или указать только нужные поля, если вам нужно переносить не все данные
INSERT INTO table_arch (pole1, pole2) select pole1, pole2 from table_act
Неактивен
А вот так
INSERT INTO table_arch(id_act, pole1, pole2) select id_act, pole1, pole2 from table_act;
По идее должно отработать если поле id_arch может принимать значение NULL или имеет значение по умолчанию.
Если не получится, то приведите сюда результаты
show create table table_arch;
и
show create table table_act;
?
Неактивен
Спасибо за оперативный ответ, но все предложенные варианты требует перечисления всех полей, которые нужно вставить. От чего я и пытался избавиться. Да, они работают.
Но мне интересно, можно ли уйти от перечисления всего, что нужно. В реальности в таблицах по 20-30 полей (есть шанс ошибки + обычная лень). Отличие - только на одно поле (id архивной записи). Плюс база в процессе разработки, и набор полей может измениться (одновременно в двух таблицах). Не хотелось бы при изменениях править еще и код этого запроса.
Отредактированно TheVeter (05.02.2014 00:16:56)
Неактивен
TheVeter написал:
Но мне интересно, можно ли уйти от перечисления всего, что нужно.
Нет, нельзя.
Неактивен
На всякий случай, еще одно пояснение: поле id_arch в архивной таблице с автоинкрементом, поэтому и нужно перед всеми полями вставить ''.
Неактивен
жалко, что нельзя. Спасибо.
Неактивен
Не обязательно, его можно и не указывать в явном виде перечислив поля для архивной таблицы. Посмотрите внимательно на предложенные вам варианты.
Неактивен
В принципе можно схитрить, написав хранимую процедуру, в которой обратиться к таблице information_schema, выбрать там все поля нужных таблиц и "склеить" из этого нужный запрос.
Если уж так лениво писать все поля ручками.
Неактивен
Кстати, да, deadka прав.
Посмотрите http://webew.ru/articles/200.webew
Неактивен
deadka написал:
В принципе можно схитрить, написав хранимую процедуру, в которой обратиться к таблице information_schema, выбрать там все поля нужных таблиц и "склеить" из этого нужный запрос.
Если уж так лениво писать все поля ручками.
Спасибо за этот вариант. Буду копать в этом направлении. Т.к. пока у меня 2-3 таблицы с записями, которые нужно архивировать - я еще могу клепать и переклепывать запросы руками. Но если в этом направлении наметится рост - без автоматизации будет очень много ручной работы.
Неактивен
vasya написал:
Кстати, да, deadka прав.
Посмотрите http://webew.ru/articles/200.webew
Спасибо за статью, кажется то, что нужно.
Завтра на свежую голову все переварю.
Неактивен
Страниц: 1