在临时表mySQL中插入多个查询?
我有以下从SQL Server迁移的存储过程,我做了大部分更改以使其在mySQL上工作,但在尝试将多个查询结果插入临时表时遇到问题:在临时表mySQL中插入多个查询?,mysql,Mysql,我有以下从SQL Server迁移的存储过程,我做了大部分更改以使其在mySQL上工作,但在尝试将多个查询结果插入临时表时遇到问题: -- -------------------------------------------------------------------------------- -- Routine DDL -- Note: comments before and after the routine body will not be stored by the server
-- --------------------------------------------------------------------------------
-- Routine DDL
-- Note: comments before and after the routine body will not be stored by the server
-- --------------------------------------------------------------------------------
DELIMITER $$
CREATE DEFINER=`Test`@`%` PROCEDURE `ListDBATree`()
BEGIN
DECLARE seq int(10);
CREATE TEMPORARY TABLE if not exists DBA_TREE(
ID VARCHAR(10),
NAME VARCHAR(50),
PARENT VARCHAR(30),
VALUE VARCHAR(30),
TYPE varchar(30)
);
insert into DBA_TREE (NAME,VALUE,PARENT,TYPE )
select VIEWNAME, SEQUENCE, null, 'None' from SD_TABLES where HIDDEN = 0;
insert into DBA_TREE (NAME,VALUE,PARENT, TYPE)
select a.DISPLAY_NAME, a.SEQUENCE, (select ID from DBA_TREE where VALUE = a.SEQ_TABLE), a.TYPE from SD_FIELDS a join SD_TABLES b on a.SEQ_TABLE = b.SEQUENCE WHERE b.HIDDEN = 0 and a.ISVIRTUAL = 0;
insert into DBA_TREE (NAME,VALUE,PARENT, TYPE)
select a.DISPLAY_NAME, a.SEQUENCE, (select ID from DBA_TREE where VALUE = a.SEQ_PARENT), a.TYPE from SD_FIELDS a join SD_TABLES b on a.SEQ_TABLE = b.SEQUENCE WHERE b.HIDDEN = 0 and a.ISVIRTUAL = 1;
select * from DBA_TREE;
END
这就是错误:
Error Code: 1137. Can't reopen table: 'DBA_TREE'
正如Bill所提到的,这是一个已知的bug,我之前关于执行
union
的回答也不起作用,因为bug说临时表不能被多次引用。例如,您甚至不能执行以下操作,这将导致相同的错误,导致多次引用表
select * from DBA_TREE dt1,DBA_TREE dt2 on dt1.id = dt2.id
我之前的回答是做一个联合
,但效果不太好,因为您实际上不止一次地引用了该表(见下文)
我知道这是一个非常尴尬的bug,如果你仔细查看bug配置文件,你会发现很多人都面临着这样的困境,并要求提供修复,但到目前为止还没有人引入(甚至没有解决方法)
因此,在这种情况下,最好使用普通表,而不是临时表
- 创建表
drop table DBA_TREE;
- 使用它
- 放下它 由于您是在一个存储过程中完成所有操作的,所以您可以像
END
标记之前,放下表
drop table DBA_TREE;
这是MySQL中临时表的已知限制。是的,我在这里发布之前确实发现了,但不确定是否是同一个问题。我得想另一个解决办法。谢谢谢谢,我会试试看,如果有用的话会告诉你的。感谢在查询中多次打开临时表的限制也适用于UNION,根据我上面提到的bug报告中的一条评论。@BillKarwin,这是正确的。这里的要点是不能多次参考表格<代码>工会如果OP没有在其选择中参考临时表,那么它将正常工作。我已相应地编辑了答案。
insert into DBA_TREE (NAME,VALUE,PARENT,TYPE )
select VIEWNAME, SEQUENCE, null, 'None' from SD_TABLES where HIDDEN = 0;
insert into DBA_TREE (NAME,VALUE,PARENT, TYPE)
select a.DISPLAY_NAME, a.SEQUENCE, (select ID from DBA_TREE where VALUE =
a.SEQ_TABLE), a.TYPE from SD_FIELDS a join SD_TABLES b on a.SEQ_TABLE =
b.SEQUENCE WHERE b.HIDDEN = 0 and a.ISVIRTUAL = 0;
insert into DBA_TREE (NAME,VALUE,PARENT, TYPE)
select a.DISPLAY_NAME, a.SEQUENCE, (select ID from DBA_TREE where VALUE =
a.SEQ_PARENT), a.TYPE from SD_FIELDS a join SD_TABLES b on a.SEQ_TABLE =
b.SEQUENCE WHERE b.HIDDEN = 0 and a.ISVIRTUAL = 1;
select * from DBA_TREE;
drop table DBA_TREE;