MYSQL: как скопировать всю строку из одной таблицы в другую в mysql со второй таблицей, имеющей один дополнительный столбец?

У меня есть две таблицы с одинаковой структурой, за исключением одного столбца... В таблице 2 есть дополнительный столбец, в который я бы вставлял CURRENT_DATE()

Я хотел бы скопировать все значения из таблицы1 в таблицу2.

если я использую

INSERT INTO dues_storage SELECT * FROM dues WHERE id=5;

он выдает ошибку, указывающую на разницу в количестве столбцов.

У меня есть два вопроса:

  • Как мне обойти это?
  • и как добавить значение для столбца дополнительной даты (CURRENT_DATE()) в таблице2 в этом же выражении?

Ответ 1

Чтобы уточнить ответ от Zed и ответить на ваш комментарий:

INSERT INTO dues_storage
SELECT d.*, CURRENT_DATE()
FROM dues d
WHERE id = 5;

См. T.J. Комментарий к Crowder

Ответ 2

Самый безопасный способ сделать это - полностью указать столбцы как для вставки, так и для извлечения. Там нет гарантии (для приложения), что любой из них будет таким, каким вы считаете.

insert into dues_storage (f1, f2, f3, cd)
    select f1, f2, f3, current_date() from dues where id = 5;

Если вы беспокоитесь о том, что вам нужно изменить несколько страниц PHP, которые это делают (как вы, кажется, указываете в комментарии к другому ответу), это созрело для хранимой процедуры. Таким образом, все ваши PHP-страницы просто вызывают хранимую процедуру с (например) только идентификатором для копирования и управляют фактическим процессом копирования. Таким образом, существует только одно место, где вам нужно поддерживать код, и, на мой взгляд, СУБД - это подходящее место для этого.

Ответ 3

INSERT INTO dues_storage
SELECT field1, field2, ..., fieldN, CURRENT_DATE()
FROM dues
WHERE id = 5;

Ответ 4

Надеюсь, это поможет кому-то... Вот немного PHP script Я написал, если вам нужно скопировать некоторые столбцы, но не другие, и/или столбцы не находятся в одном порядке в обеих таблицах. Пока столбцы называются одинаковыми, это будет работать. Поэтому, если таблица A имеет [userid, handle, something] и tableB имеет [userID, handle, timestamp], тогда вы бы "SELECT userID, handle, NOW() как временная метка FROM tableA", затем получите результат этого и передать результат в качестве первого параметра этой функции ($ z). $toTable - это строковое имя для таблицы, в которую вы копируете, и $link_identifier - это db, к которому вы копируете. Это относительно быстро для небольших наборов данных. Не рекомендуется, чтобы вы пытались перемещать более нескольких тысяч строк за раз таким образом в настройках производства. Я использую это прежде всего для резервного копирования данных, собранных во время сеанса, когда пользователь выходит из системы, а затем сразу же очищает данные из живого db, чтобы сохранить его тонким.

 function mysql_multirow_copy($z,$toTable,$link_identifier) {
            $fields = "";
            for ($i=0;$i<mysql_num_fields($z);$i++) {
                if ($i>0) {
                    $fields .= ",";
                }
                $fields .= mysql_field_name($z,$i);
            }
            $q = "INSERT INTO $toTable ($fields) VALUES";
            $c = 0;
            mysql_data_seek($z,0); //critical reset in case $z has been parsed beforehand. !
            while ($a = mysql_fetch_assoc($z)) {
                foreach ($a as $key=>$as) {
                    $a[$key] = addslashes($as);
                    next ($a);
                }
                if ($c>0) {
                    $q .= ",";
                }
                $q .= "('".implode(array_values($a),"','")."')";
                $c++;
            }
            $q .= ";";
            $z = mysql_query($q,$link_identifier);
            return ($q);
        }

Ответ 5

В качестве альтернативы вы можете использовать Внутренние запросы для этого.

SQL> INSERT INTO <NEW_TABLE> SELECT * FROM CUSTOMERS WHERE ID IN (SELECT ID FROM <OLD_TABLE>);

Надеюсь, это поможет!

Ответ 6

Просто хотел добавить этот маленький фрагмент, который прекрасно работает для меня.

INSERT INTO your_target_table ВЫБРАТЬ * FROM your_rescource_table WHERE id = 18;

И в то время как я нахожусь, он громко кричит Sequel Pro, если вы его не используете, я настоятельно рекомендую загрузить его... упрощает жизнь.

Ответ 7

Я попробовал, что вы сказали, но я получаю сообщение, в котором говорится, что есть проблема с предложением where

вот что я пробовал:

 INSERT INTO `seller` SELECT  FROM `seller_test` WHERE
`s_code`=11;

Ошибка:

> #1064 - You have an error in your SQL syntax; check the manual that corresponds to your   MySQL server version for the right syntax to use
> near 'FROM `seller` WHERE `s_code`=11' at line 1

но когда я добавил * после ключевого слова SELECT и запрос стал примерно таким:

INSERT INTO `seller` SELECT ***** FROM `seller_test` WHERE
`s_code`=11;

Я получаю хороший результат поэтому попробуйте добавить * после ключевого слова SELECT