построчный INSERT... SELECT из одной БД в другую. возможно ?

построчный INSERT... SELECT из одной БД в другую. возможно ?

Всем здравствуйте.
Люди, подскажите пожалуйста. Надо из таблицы одной БД перетащить данные в таблицу другой БД. Одним запросом это не сделать т.к. нужен ID вставляемой строки для внесения дополнительной инфы в другие таблицы.
Итак, есть два дескриптора подключения к двум базам. Есть запрос: "INSERT INTO `secondDb`.`table`(fieldsList) FROM `firstDb`.`table` VALUES(fieldsList)";. Вот только проблема в том, что ф-ия mysql_query() вторым параметром принимает только один дескриптор соединения. Есть варианты, чтобы не париться или всё таки придётся делать запрос к первой БД и уже вторым вставлять данные из первой во вторую БД ?
 

Фанат

oncle terrible
Команда форума
из одной бд в другую без проблем.
с одного сервера на другой - только дампом
 

Gas

может по одной?
Вася Патриков
не нужно 2 дескриптора, просто у пользователя должен быть доступ к обоим базам.
 
Я видимо не совсем чётко объяснился. Тут в принципе то дело и не в необходимости, а просто интереса.
вот чтобы вместо такого:
$companyX = mysql_fetch_assoc($firstDbqueryResult);
mysql_query("INSERT INTO company
SET country=".$companyX['country'].",
region=".$companyX['region'],
$secondMysqlLinkId);
написать, что то типа:
mysql_query("INSERT INTO `firstDb`.`company`(counry, region,)
VALUES(`secondDb`.`country`,
`secondDb`. `region`", ???);
и получить ID: $id = mysql_insert_id();
*****
Сервер один и тот же.
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
Вася Патриков
чтобы не париться или всё таки придётся делать запро
Ответы на все вопросы
http://dev.mysql.com/doc/refman/5.0/en/select.html

-~{}~ 23.01.08 13:26:

и получить ID: $id = mysql_insert_id();
1. Импортнуть оба дампа.

ID связей во второй таблице может поменяться :confused: ?
 

Gas

может по одной?
Вася Патриков
ты уже попробовал что сам написал и оно не работает? Теоритически должно. Что касается твоих ???? в mysql_query, я уже написал.
 

Фанат

oncle terrible
Команда форума
Тут в принципе то дело и не в необходимости, а просто интереса.
Вася. Вот давай только без этих "интересов". Вопросы, продиктованные не необходимостью, а интересом, обычно не могут быть нормально сформулированы и толком продуманы.

объясняй реальную задачу и затруднения.
 

alexcrown

Новичок
Где-то я тут писал уже возможное решение такой задачи. MySql поддерживает ссылки на таблицы на другом сервере. См. мануал на тему FEDERATED storage engine http://dev.mysql.com/doc/refman/5.1/en/federated-storage-engine.html
 

Gas

может по одной?
alexcrown
о боже :)
зачем притягивать за уши то, что увеличивает сложность и без чего можно прекрасно обойтись.
 
Задача: перенести данные о компаниях из одной бд (первая бд) в другую (вторая бд). MySQL 5.*, таблицы MyISAM. Обе БД лежат на одном сервере.
Переносим данные о компании. Получаем ID вставленной строки и потом по этому ID пишем второстепенные данные об этой компании в другие таблицы (которые так же беруться из других таблиц первой БД). Для этого и нужен ID.

Скрипт:
PHP:
$firstMysqlLinkId = mysql_connect("localhost", "one", "one");
mysql_select_db('one', $firstMysqlLinkId);
$secondMysqlLinkId = mysql_connect("localhost", "two", "two");
mysql_select_db('two', $secondMysqlLinkId);

echo "Hello!hello!\n";
$companyResult = mysql_query('SELECT * FROM one.company ORDER BY fullname LIMIT 1', $firstMysqlLinkId) ;
echo mysql_num_rows($companyResult)."\n";
for ($j = 1; $companyMeat = mysql_fetch_assoc($companyResult); $j ++) {
  echo $j.'. '.$companyMeat['id']."\n";
  
    mysql_query("INSERT INTO one.company(country, region, city, opf_id, lastmodified, dateadd, checked, avaliableForAll)
               VALUES(two.company.country,
                      two.company.region,
               		  two.company.city,
                      two.company.opf_id,
                      two.company.lastmodified,
                      two.company.dateadd,
                      two.company.checked,
                      two.company.avaliableForAll)
               FROM two.company
               WHERE id=".$companyMeat['id']);
  echo mysql_insert_id($firstMysqlLinkId);
}
В итоге:
Hello!hello! - выводит. Затем получаю ошибку "Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in..." для строки $companyResult = mysql_query('SEL... если же туда поставить or die(mysql_error()) - то скрипт вообще ничего не выводит (за исключением "Hello!hello "), но и никаких действий не производит.
 

antson

Новичок
Партнер клуба
Вася Патриков
если я понял id нужен для того чтобы потом подчиненные таблицы ?
пусть у нас исходные A(id,value),B(id,id_a,value)
куда вставляем AA(id,value,old_id) ,BB(id,id_a,value)


insert into новаябаза.AA (old_id,value) select id,value from стараябаза.A
синтаксис инсерта
http://dev.mysql.com/doc/refman/5.0/en/insert.html

второй запрос по сложнее
суть объединить B и AA чтобы по старому ID вытащить новый

insert into новаябаза.BB (id_a,value) select t2.id,t1.value from стараябаза.B t1,новаябаза.AA t2 where t1.id_a = t2.old_id

-~{}~ 23.01.08 15:45:

пользователь должен иметь достаточно прав в обоих базах.
 
Да дело не в ID. Но если надо, то есть таблица company и company_contacts у которой поле company_id - внешний ключ на ID компании в company. Поэтому при переносе в новую БД всей этой инфы мне и нужен этот долбагый айдишник, что бы контакты соответствовали только что внесённой новой компании. И синтаксис запросов меня тоже слабо волнует, хотя конечно спасибо за помощь. Меня интересует как работать с двумя БД в случае использования таких запросов. У меня пока не получается. А скрипт я и так уже дописываю, но по другому только ))
 

Фанат

oncle terrible
Команда форума
Вася Патриков
тебе перенести или добавить? весь этот геморрой имеет смысл только если ты добавляешь в базу, где уже есть какие-то компании.
если же перенести, то непонятно, почему нельзя просто перелить все таблицы?
 

Gas

может по одной?
Меня интересует как работать с двумя БД в случае использования таких запросов.
Чтобы работать с двумя и более БД сразу нужно:
1) права на доступ к этим базам для пользователя, который задаётся в mysql_connect();
2) указание имени базы перед именем таблицы, если эта таблица находится в базе, отличной от mysql_select_db().

Всё. Не нужно никаких 2-х коннектов и ресурсов (если работает пункт 1).

А для данного случая не вижу причин не использовать mysqldump.
 

antson

Новичок
Партнер клуба
Вася Патриков
посмотри внимательно на что я писал

совсем не обязательно иметь два конекта к базам
когда мы выбираем текущую это только позволяет
неиспользовать перед именим таблицы префикса базы данных

Select * from table

а можно явно указывать имя БД

select * from database.table
 
*****
мне нужно добавить.
Gas
Я немного не договорил - структура таблиц несколько отличается, поэтому значения некоторых столбцов нужно предварительно преобразовать.
antson
Не обязательно mysql_select_db() делать, а не конектится. Так я в запросе так и пишу - `db`.`table`.`field`.
Ну не хочет mysql_query() почему то запрос выполнять и ошибки не выдаёт.
 

antson

Новичок
Партнер клуба
Вася Патриков
телепатические возможности временно недоступны.
поэтому иди от тестовых вещей к реальным.
или внимательно разбирайся с сообщениями об ошибках.

разбивай задачу. сперва поля без преобразований.
 

Фанат

oncle terrible
Команда форума
Слушай, Вася.
Перелей ты, ради бога, все эти таблицы во вторую базу, как есть.
А потом уже решай задачу слияния БЕЗ геморроя с двумя коннектами.
 
Хорошо )))) Не Вася я - ник мне смените )))))))

-~{}~ 23.01.08 18:31:

Заключение:
PHP:
$firstDbMysqlLinkId = mysql_connect("localhost", "firstDb", "firstDb");
$secondDbMysqlLinkId = mysql_connect("localhost", "secondDb", "secondDb");

mysql_query("INSERT INTO firstDb.company(regoin)
             SELECT region
             FROM secondDb.company
             WHERE id=".$secondDbCompany['id'], $firstDbMysqlLinkId)
or die(__LINE__.'.firstDb: '.mysql_error($firstDbMysqlLinkId)."\nsecond: ".mysql_error($secondDbMysqlLinkId));
Не работает, потому что в зависимости от дескриптора соединения, стоящего в mysql_query() MySQL ругается, что "SELECT command denied to user 'firstDb'@'localhost' for table 'company'".
А если поставить другой дескриптор, то наоборот - "INSERT command denied to user 'secondDb'@'localhost' for table 'company'".
Короче, перекрёстный огонь. Зато теперь точно знаю, что при работе с двумя соединениями, в mysql_error() нужно обязательно указывать дескриптор. Потому что скрипт умирает, а ошибки никакой не видно )))))))
 
Сверху