PHP

2017-01-03 1 views
3

을 사용하여 다른 데이터베이스의 MySQL의 테이블 구조를 만드는 방법은 2 개의 별도 및 다른 데이터베이스가 :PHP

  • SOURCE_DATABASE
  • TARGET_DATABASE

내가 SOURCE_DATABASE에서 테이블을 복사하려고를 phpMyAdmin이 아닌 PHP를 사용하여 TARGET_DATABASE (phpMyAdmin에서 정상적으로 작동 함).

I가 다음 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

mysqli를 사용하지 마십시오. PHP 7에서 mysql이 제거되었습니다. 2ed 데이터베이스를 사용 하시겠습니까? PHP를 사용하는 데이터베이스? – TheCrazyProfessor

+0

감사합니다. @JayBlanchard. 다른 곳에서 묻지도 않고 대답하지도 않았기 때문에 OQ를 편집했습니다. 비슷한 질문을 반복해서 보았습니다 ... –

+0

@TheCrazyProfessor에게 감사 드려요. "예"는 데이터베이스 1 (소스)의 테이블을 구조, 데이터 및 인덱스와 마찬가지로 PHP를 사용하여 데이터베이스 2 (대상)에 복사하는 것입니다. –

답변

0

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); 
1

PhpMyAdmin과 PHP는이 목적을 위해 잘못된 도구입니다. 명령 행 쉘을 사용하십시오. 이 같은 것을 :

mysqldump -u root -p database1 > database1.sql 

mysql -u root -p database < database1.sql 

더 빨리 10 배 더 작동합니다. 또한 데이터베이스는 사용자 대신 데이터 일관성에주의를 기울입니다.

PHP에서 실제로하고 싶다면 php command line shell을 사용하십시오.

당신은 여전히 ​​커맨드 라인 쉘없이 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 특성 필드와 관련이 있습니다. 쿼리가이 필드보다 클 경우 (예, 쿼리 문자열이 1GB의 메모리를 할당 할 수 있음) MySQL은 예외를 throw합니다. 그래서, 멀티 쿼리를 삽입하기 위해서는 max_allowed_packet을 얻어야하고이 크기에 따라이 쿼리를 생성해야합니다. 또한 성능을 향상 시키려면 목표 테이블에서 disable keys 수 있습니다. (enable keys, lol)

+0

OQ에 대한 대답은 PHP @degr에서이 문제를 해결할 수 없다는 사실입니다. PHP에서 명령 행과 phpMyAdmin이 바람직한 대안이되지 않도록하기 위해이 애플리케이션을 구축하고 있습니다. –

+0

대답을 – degr

+0

고맙습니다. @degr. 나는 당신의 대답을 들여다보고 그것을 시도 할 것입니다. 데이터베이스의 모든 테이블을 캡처 할 이유가 없습니다. 본질적으로 db1에서 db2로 복사하려는 정확한 테이블을 알고 있습니다. 그래서 코드 줄이 압축됩니다. –