mysql 临时表 cann't reopen解决方案
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql 临时表 cann't reopen解决方案相关的知识,希望对你有一定的参考价值。
参考技术A 当你创建临时表的时候,你可以使用temporary关键字。如:复制代码
代码如下:
create
temporary
table
tmp_table(name
varchar(10)
not
null,passwd
char(6)
not
null);
或
复制代码
代码如下:
create
temporary
table
if
not
exists
sp_output_tmp
engine=
memory
select
…from
…
where
ID=current_id;
临时表只在当前连接可见,当这个连接关闭的时候,会自动drop。这就意味着你可以在两个不同的连接里使用相同的临时表名,并且相互不会冲突,或者使用
已经存在的表,但不是临时表的表名。(当这个临时表存在的时候,存在的表被隐藏了,如果临时表被drop,存在的表就可见了)。创建临时表你必须有
create
temporary
table
权限。
下面几点是临时表的限制:
1、临时表只能用在
memory,myisam,merge,或者innodb
2、临时表不支持mysql
cluster(簇)
3、在同一个query语句中,你只能查找一次临时表。例如:下面的就不可用
复制代码
代码如下:
mysql>
SELECT
*
FROM
temp_table,
temp_table
AS
t2;
ERROR
1137:
Can't
reopen
table:
'temp_table'
mysql
bug地址:http://bugs.mysql.com/bug.php?id=10327
如果在一个存储函数里,你用不同的别名查找一个临时表多次,或者在这个存储函数里用不同的语句查找,这个错误都会发生。
4、show
tables
语句不会列举临时表
你不能用rename来重命名一个临时表。但是,你可以alter
table代替:
复制代码
代码如下:
mysql>ALTER
TABLE
orig_name
RENAME
new_name;
临时表用完后要记得drop掉:
复制代码
代码如下:
DROP
TEMPORARY
TABLE
IF
EXISTS
sp_output_tmp;
如何在mysql程序中创建临时表并生成不同的名称?
我想创建具有不同表名的临时表。
存储过程不接受输入参数,创建临时表并将表的表名返回为T_1,T_2,T_3 ....
我怎样才能在mysql存储过程中实现它?
答案
以下程序应该对您有帮助。但是这种序列生成仅适用于当前的连接会话。但是我希望你可以在临时表上预期它。
delimiter //
drop procedure if exists set_new_temp_table //
create procedure set_new_temp_table()
begin
if( @temp_table_seq_num is null ) then
set @temp_table_seq_num := 1;
end if;
set @temp_table_name := Concat( 'T_', @temp_table_seq_num );
set @sql := concat( 'create temporary table if not exists '
, @temp_table_name
, '( col1 int, col2 varchar(10) )'
);
prepare stmt from @sql;
execute stmt;
drop prepare stmt;
set @temp_table_seq_num := ( cast( @temp_table_seq_num as decimal ) + 1 );
set @sql := null;
end;
//
delimiter ;
select @temp_table_name; -- should return a NULL before first ever call to SP
call set_new_temp_table(); select @temp_table_name;
但@ z zxsw Poi
另一答案
这是完整的例子
MySQL 5.5.32 Fiddle
另一答案
您可以在创建表时使用TEMPORARY关键字。 TEMPORARY表仅对当前会话可见,并在会话关闭时自动删除。这意味着两个不同的会话可以使用相同的临时表名,而不会相互冲突或与现有的同名非TEMPORARY表冲突。 (在删除临时表之前,将隐藏现有表。)要创建临时表,您必须具有CREATE TEMPORARY TABLES特权。
以上是关于mysql 临时表 cann't reopen解决方案的主要内容,如果未能解决你的问题,请参考以下文章
MySQL : You can't specify target table 'Person' for update in FROM clause
mysql怎么把固定的几个字符串,转成列的形式作为临时表查询