2017-04-13 6 views
0

PHP에서 ETL 스크립트의 일부로 mysql의 기존 (및 채워진) 테이블을 인덱싱하려고합니다. 나는 두 개의 인덱스 문 (호출이 create_index.sql)가 :mysql은 CLI 또는 GUI와 비교하여 일괄 처리 인덱스를 만듭니다.

$conn = new mysqli('my_host', 'my_user', 'my_pass', 'my_db'); 
$result = $conn->query(file_get_contents('create_index.sql'); 
if (false === $result) 
    error_log($conn->error); 

:

create index my_index_1 on my_table (my_col_1); 
create fulltext index my_index_2 on my_table (my_col_2 asc, my_col_3 asc); 

이것은 SQL (텍스트) 파일을로드하고 배치로 실행을 통해 인구 후 실행, PHP를 통해 자동화 (PHP를 통해) 위에 나열된대로 실행되면 'SQL 구문에 오류가 있습니다.'라는 표준이 표시됩니다.

MySQL Workbench에서 실행될 때 정확하게 동일한 두 개의 create index 문이 오류없이 실행됩니다.

다른 사람이 GUI 구문과 다른 방향으로 나를 가리킬 수 있습니까? 내가 틀린 나무를 짖고 있니?

+2

파일의 줄을 분할하고 한 번에 하나씩 실행해야합니다. 쿼리 메서드는 단일 SQL 문을 필요로합니다. –

답변

1

파일의 각 SQL 문을 별도로 실행해야합니다. 명령문을 분할하는 것은 좀 더 우아 할 수 있지만 질문에 표시 한 내용에 따라 다음과 같이 작동해야합니다.

$conn = new mysqli('my_host', 'my_user', 'my_pass', 'my_db'); 
$sql_file_text = file_get_contents('create_index.sql'); 
$sql = explode(';',$sql_file_text); 
foreach($sql as $key => $sql_statement) { 
    if($sql_statement != '') { 
     $result = $conn->query($sql_statement); 
     if (false === $result) { 
      error_log($conn->error); 
     } 
    } 
} 
+0

감사합니다. 왜 그 방향으로 나를 가리킬 수 있습니까? 특정 유형의 일괄 처리가 허용되었거나 확정 된 단 한 번의 명령문 수 제한이 있습니까? –

+1

다중 명령문 쿼리를 실행하는 다른 방법이 있습니다. 쿼리의 경우 하드 한도입니다. 자세한 정보는 mysql 문서의 메소드를 참조하십시오. 다른 방법은 [mysqli_multi_query] (http://php.net/manual/en/mysqli.multi-query.php)를 참조하십시오. –