2017-04-13 46 views
0

我想索引MySQL中的現有(並填充)表作爲PHP中ETL腳本的一部分。我有兩個指數報告(稱之爲create_index.sql):mysql從批處理與CLI或GUI創建索引

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

這是通過PHP的自動化,通過加載SQL(文本)文件,並執行它作爲批處理人口後運行:

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

當如上所列執行(通過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) –