Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在临时表mySQL中插入多个查询?_Mysql - Fatal编程技术网

在临时表mySQL中插入多个查询?

在临时表mySQL中插入多个查询?,mysql,Mysql,我有以下从SQL Server迁移的存储过程,我做了大部分更改以使其在mySQL上工作,但在尝试将多个查询结果插入临时表时遇到问题: -- -------------------------------------------------------------------------------- -- Routine DDL -- Note: comments before and after the routine body will not be stored by the server

我有以下从SQL Server迁移的存储过程,我做了大部分更改以使其在mySQL上工作,但在尝试将多个查询结果插入临时表时遇到问题:

-- --------------------------------------------------------------------------------
-- 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;