【问题标题】:Trying to use UNION ALL to INSERT into temporary table尝试使用 UNION ALL 插入临时表
【发布时间】:2012-12-15 14:48:15
【问题描述】:

我正在尝试设置一个基本的搜索脚本。建议将当前 mysql 表中的数据插入到临时表中以加快搜索速度。

这是我目前得到的代码:

$temp = 'search_' . date('YmdHis'); // name your temp table

$sql = "CREATE TEMPORARY TABLE IF NOT EXISTS {$temp} (
      `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
      `Model` varchar(255) default NULL,
      `Make` varchar(255) default NULL,
      `Year` varchar(255) default NULL,
      `Loc.` varchar(255) default NULL,
      `Sale Price` varchar(255) default NULL,
      `Serial No.` varchar(255) default NULL,
      `Stock No.` varchar(255) default NULL,
      `Tag No.` varchar(255) default NULL,
      `Comments` varchar(255) default NULL,
      `Description` varchar(255) default NULL,
      FULLTEXT KEY `Model` (`Model`,`Make`,`Year`,`Loc.`,`Sale Price`,`Serial No.`,`Stock No.`,`Tag No.`,`Comments`,`Description`)
     )";

$sql .= "INSERT INTO $temp (
        id,
        Model,
        Make,
        Year,
        `Loc.`,
        `Sale Price`,
        `Serial No.`,
        `Tag No.`,
        Comments,
        Description
        )

        (
        (SELECT null,`Model`,`Make`,`Year`,`Loc.`,`Sale Price`,`Serial No.`,`Stock No.`,`Tag No.`,`Comments`,`Description` FROM ag_auger_and_grain_handling WHERE Status='IN' or Status='OF'
            UNION ALL
        SELECT null,`Model`,`Make`,`Year`,`Loc.`,`Sale Price`,`Serial No.`,`Stock No.`,`Tag No.`,`Comments`,`Description` FROM ag_combine WHERE Status='IN' or Status='OF'
            UNION
        SELECT null,`Model`,`Make`,`Year`,`Loc.`,`Sale Price`,`Serial No.`,`Stock No.`,`Tag No.`,`Comments`,`Description` FROM ag_tractor WHERE Status='IN' or Status='OF')
        )
    )";

?>

这是我收到的错误:

无法执行查询,因为:您的 SQL 语法有错误; 检查与您的 MySQL 服务器版本相对应的手册 在 'INSERT INTO search_20121215094411 ( id, 型号、品牌、年份、Loc.、`' 在第 14 行

我只能猜测它与非常规的列名(Loc.、Sale Price 等)有关。这些是由以前的程序员设置的,我不能对它们进行任何更改。

【问题讨论】:

  • 您使用的是旧的mysql_query() API 吗?对于较旧的驱动程序,它不支持单个查询调用中的多个语句。必须先执行CREATE TABLE,再单独执行INSERT

标签: php mysql insert union-all


【解决方案1】:

您在 sql 的 create 部分的括号之后或插入之前缺少一个分号。

【讨论】:

    【解决方案2】:

    你有一个额外的)

     $sql .= "INSERT INTO $temp (
        id,
        Model,
        Make,
        Year,
        `Loc.`,
        `Sale Price`,
        `Serial No.`,
        `Tag No.`,
        Comments,
        Description
        )
    
        (
        (SELECT null,`Model`,`Make`,`Year`,`Loc.`,`Sale Price`,`Serial No.`,`Stock No.`,`Tag No.`,`Comments`,`Description` FROM ag_auger_and_grain_handling WHERE Status='IN' or Status='OF'
            UNION ALL
        SELECT null,`Model`,`Make`,`Year`,`Loc.`,`Sale Price`,`Serial No.`,`Stock No.`,`Tag No.`,`Comments`,`Description` FROM ag_combine WHERE Status='IN' or Status='OF'
            UNION
        SELECT null,`Model`,`Make`,`Year`,`Loc.`,`Sale Price`,`Serial No.`,`Stock No.`,`Tag No.`,`Comments`,`Description` FROM ag_tractor WHERE Status='IN' or Status='OF')
        )
    ";
    

    【讨论】:

    • 不行,表名是search,MySQL中表标识符不是单引号的。
    • 现在您完全丢失了表名。列列表属于()
    • 是的,您仍然缺少INSERT INTO tablename (col1, col2, col3) VALUES (1,2,3) 语法中的表名。表名不应包含()
    • 不 - 你仍然在表名 '$temp' 周围有单引号,MySQL 会将其解释为字符串文字。 OP 的问题是尝试在一次调用中执行 2 条语句,这是不受支持的。这不是语法错误。
    • 是的,但它仍然是错误的,并且仍然没有帮助。 INSERT ... SELECT statment. 中没有 VALUES 关键字
    【解决方案3】:

    我相信您的“INSERT INTO $temp”行没有插入 $temp 的内容,而是实际上使用 $temp 作为表名。试试这样的:

    $sql="INSERT INTO ".$temp." (....

    【讨论】:

      【解决方案4】:

      当使用“union”插入临时表时,应该为表“union”创建别名

      insert into temp_table (select * from (select * from table_a union select * from table_b) as table_alias)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-13
        • 2012-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-07
        相关资源
        最近更新 更多