尝试使用 UNION ALL 插入临时表

Posted

技术标签:

【中文标题】尝试使用 UNION ALL 插入临时表【英文标题】:Trying to use UNION ALL to INSERT into temporary table 【发布时间】: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 【参考方案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)

【讨论】:

以上是关于尝试使用 UNION ALL 插入临时表的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SQL 中的 Case 语句将数据插入临时表

如何复制临时表中列的默认约束?

SQL Server 存储过程创建临时表并插入值

如何使用 jdbc oracle 插入和选择全局临时表? [复制]

从 SQL 动态结果插入临时表

如何从存储过程返回的游标将数据插入临时表