2017-04-13 19 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) –