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

Поскольку я понимаю, что Вам нужна кластерная файловая система, которая доступна всем машинам в основанной на Linux инфраструктуре.

я предлагаю, чтобы Вы взглянули на Блеск . Это почти точно, что Вы ищете за исключением того, что это не синхронизирует данные локально.

71
задан hjpotter92 10 October 2013 в 16:55
поделиться

4 ответа

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

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

См. Комментарий TJ Crowder

89
ответ дан 24 November 2019 в 12:59
поделиться
INSERT INTO dues_storage
SELECT field1, field2, ..., fieldN, CURRENT_DATE()
FROM dues
WHERE id = 5;
8
ответ дан 24 November 2019 в 12:59
поделиться

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

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

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

51
ответ дан 24 November 2019 в 12:59
поделиться

Надеюсь, это кому-то поможет ... Вот небольшой PHP-скрипт, который я написал на случай, если вам нужно скопировать несколько столбцов но не другие, и / или столбцы находятся в разном порядке в обеих таблицах. Пока столбцы названы одинаково, это будет работать. Итак, если в таблице A есть [идентификатор пользователя, дескриптор, что-то], а в таблице B есть [идентификатор пользователя, дескриптор, временная метка], тогда вы должны «ВЫБРАТЬ ИД пользователя, дескриптор, СЕЙЧАС () как временную метку ИЗ таблицы A», затем получить результат и передать результат в качестве первого параметра этой функции ($ z). $ toTable - это строковое имя таблицы, в которую вы копируете, а $ link_identifier - это база данных, в которую вы копируете. Это относительно быстро для небольших наборов данных. Не рекомендуется пытаться переместить более нескольких тысяч строк за раз таким способом в производственных условиях. Я использую это в первую очередь для резервного копирования данных, собранных во время сеанса, когда пользователь выходит из системы, а затем немедленно очищаю данные из живой базы данных, чтобы сохранить ее компактность.

 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);
        }
4
ответ дан 24 November 2019 в 12:59
поделиться
Другие вопросы по тегам:

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