【问题标题】:mysql create index from batch vs. CLI or GUImysql 从批处理与 CLI 或 GUI 创建索引
【发布时间】:2017-04-13 18:39:59
【问题描述】:

我正在尝试将 mysql 中的现有(和填充的)表作为 PHP 中 ETL 脚本的一部分进行索引。我有两个索引语句(称之为create_index.sql):

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 在我假设的语句之间所做的不同的方向,这会导致相同语句的不同结果吗?我是不是找错树了?

【问题讨论】:

  • 您需要拆分文件中的行,然后一次执行一行。查询方法需要一条 sql 语句。

标签: php mysql mysql-workbench etl


【解决方案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);
        }
    }
}

【讨论】:

  • 谢谢你,这有效。你能指出我为什么的方向吗?是否允许允许某些类型的批次,或者是否有严格的每次执行一个语句的限制?
  • 还有另一种执行多语句查询的方法。对于查询,这是一个硬限制。在 mysql 文档中查找该方法以获取更多信息。其他方法见mysqli_multi_query
猜你喜欢
  • 2015-01-18
  • 1970-01-01
  • 1970-01-01
  • 2016-04-06
  • 1970-01-01
  • 2011-03-22
  • 2012-09-12
  • 2013-08-31
  • 1970-01-01
相关资源
最近更新 更多