2015-06-30 2 views
1

Первый вопрос, я неустанно искал ответ, но кажется, что люди, кажется, спрашивают «от одной базы данных к другой», когда они имеют в виду таблицу. Anyways ...Перемещение строк из таблиц в одной базе данных в другую базу данных с использованием PDO

У меня есть база данных, полная таблиц, которые записывают результаты для различных игровых рисунков. Эти таблицы имеют много разных структур, причем наименьшее число из них имеет 5 полей и самое большое - около 20. У меня также есть база данных, содержащая таблицы результатов из этих игр, возраст которых превышает год. Так что в db1 у меня есть game1, а в db2 у меня есть game1_archive. То, что я пишу, - это сценарий, который запускается один раз в день и перемещает любые записи из таблиц db1, которые старше года, соответствуют соответствующей таблице db2.

У меня есть список таблиц в DB1 перебирать:

try { 
    $db1_pdo = new PDO($db_game, $db_username, $db_password); 
    $db2_pdo = new PDO($db_archive, $db_username, $db_password); 
} catch (PDOException $exception) { 
    echo 'Connection failed: ' . $exception->getMessage(); 
    die(); 
} 

$cutoff_date = date('Y-m-d', time() - (366 * 24 * 60 * 60)); 

$tables = array(); 
$result = $db1_pdo->query("SHOW TABLES"); 
$tables = $result->fetchAll(PDO::FETCH_COLUMN, 0); 

Что было бы проще сделать, это просто INSERT INTO _ FROM _ WHERE _ запрос следующим образом:

foreach ($tables as $table) { 
    $result = $db1_pdo->query("INSERT INTO archive.$table"."_archive * FROM $table WHERE drawing_date < '$cutoff_date'"); 
    $db1_pdo->query("DELETE FROM $table WHERE drawing_date < '$cutoff_date'"); 
} 

Но это не работает, я думаю, потому что db1_pdo не имеет доступа к обеим базам данных? Имя пользователя и пароль для доступа к обеим базам данных одинаковы. Есть ли простой способ заставить INSERT INTO работать? Если у меня есть инструкции для сборки INSERT, это будет больно, потому что каждая таблица имеет другую структуру.

+0

Вы пропускаете 'SELECT' ключевое слово , Напишите запрос 'SELECT', который возвращает нужные строки. Затем добавьте INSERT INTO foo (cols) 'перед этим, чтобы превратить его в инструкцию' INSERT .. SELECT'. – spencer7593

ответ

1

Я думаю, что с помощью INSERT INTO ... SELECT ... метод будет работать в вашем случае

$result = $db1_pdo->query("INSERT INTO archive.$table"."_archive SELECT * FROM $table WHERE drawing_date < '$cutoff_date'"); 

Более подробную информацию о синтаксисе можно там: https://dev.mysql.com/doc/refman/5.0/en/insert-select.html

+0

Большое вам спасибо, просто попробовал, и он успешно передает записи из одной базы данных в другую, а затем удаляет ее. Сэкономил мне много работы из-за этого отсутствия SELECT! – Kramhsiri

Смежные вопросы