尝试使用 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 插入临时表的主要内容,如果未能解决你的问题,请参考以下文章