Как создать структуру таблицы MySQL в другой базе данных, используя переполнение стека

У меня есть 2 отдельные и разные базы данных:

  • SOURCE_DATABASE
  • TARGET_DATABASE

Я пытаюсь скопировать таблицу из SOURCE_DATABASE в TARGET_DATABASE, используя PHP, а не phpMyAdmin (как это прекрасно работает в phpMyAdmin).

У меня есть следующий php:

$linkSource = mysql_connect( SERVER, SOURCE_USERNAME, SOURCE_PASSWORD );
mysql_select_db( SOURCE_DATABASE, $linkSource );
$linkTarget = mysql_connect( SERVER, TARGET_USERNAME, TARGET_PASSWORD );
mysql_select_db( TARGET_DATABASE, $linkTarget );

mysql_query( 'CREATE TABLE `targetDB.targetTable` LIKE `sourceDB.sourceTable` ) or die( mysql_error() );

Можно ли создать таблицу во 2-й базе данных (цель), используя структуру таблицы в 1-й базе данных (источник)?

3

Решение

PhpMyAdmin и PHP — неправильные инструменты для этих целей. Используйте командную строку оболочки. Что-то вроде этого:

mysqldump -u root -p database1 > database1.sql

mysql -u root -p database < database1.sql

Это будет работать в 10 раз быстрее, я это гарантирую. Кроме того, база данных позаботится о согласованности данных вместо вас.

Если вы действительно хотите сделать это на PHP, используйте оболочка командной строки php.

Если вы все еще хотите сделать это в PHP БЕЗ оболочки командной строки, я могу порекомендовать сделать такой трюк:

$query = "show tables from source_database";
$tables = $dbSource->getColumn($query)//get one column from database
foreach($tables as $tableName) {
$query = "show create table ".$tableName;//← it will return query to clone table structure
$createTableSchema = $dbSource->getRow($query);//← get assoc array of one row
$dbTarget->query($createTableSchema['Create Table']);//← here is your silver bullet
}

PS а также, когда (если) вы будете копировать данные из одной таблицы в другую, вы должны знать это утверждение

insert into table () values (values1), (values2), (values3);

намного быстрее чем

insert into table () values (values1);
insert into table () values (values2);
insert into table () values (values3);

Но вставить много строк связано с max_allowed_packet собственное поле. В случае, когда ваш запрос будет больше, чем это поле (да, строка запроса может выделить 1 ГБ памяти), MySQL выдаст исключение. Итак, для построения Вставить многопользовательский запрос вы должны получить max_allowed_packet и сгенерируйте этот запрос в соответствии с этим размером. Также для ускорения производительности вы можете disable keys из целевой таблицы. (не забыл enable keys, лол)

1

Другие решения

Вы можете использовать функцию MySQL «SHOW CREATE TABLE», чтобы получить структуру исходной таблицы, а затем выполнить инструкцию CREATE TABLE, которую она дает вам в целевом соединении.

$result = mysql_query("SHOW CREATE TABLE sourceTable", $linkSource);
$create_table = mysql_result($result, 0, 1);
mysql_query($create_table, $linkTarget);
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector