mysql存储过程里面如果用到一个临时表
存储过程里面有一个判断是这个临时表是否存在如果存在就删除然后在创建
我想问的是如果当一个用户操作调用到这个存储过程还未关闭连接时
另外一个用户也操作到这个存储过程了 那存储过程会去判断这个临时表是否存在
那么这时临时表肯定是存在的 就会执行删除操作 删掉以后会不会对前面一个用户造成影响?
如果有会是什么影响? sql里面如果用到这样会不会也有这种影响?
存储过程里面有一个判断是这个临时表是否存在如果存在就删除然后在创建
我想问的是如果当一个用户操作调用到这个存储过程还未关闭连接时
另外一个用户也操作到这个存储过程了 那存储过程会去判断这个临时表是否存在
那么这时临时表肯定是存在的 就会执行删除操作 删掉以后会不会对前面一个用户造成影响?
如果有会是什么影响? sql里面如果用到这样会不会也有这种影响?
Begin
drop table ##temp
end
就像这样?如果一个用户正在连接 那么这个##temp表就创建了 又有一个用户来连接 然后会执行删除操作?
这样会有影响吗对前一个用户? 没有影响的话 数据库是怎么来处理的?
MSSQL中,不同连线(session)可以有同名临时表的,
在tempdb里有另外的名称,由SQL Server自行管理的.
所以不会有冲突.
能否请大虾解决下小弟的疑问 谢谢了
create table #temp (x int)-- 连线2执行
create table #temp (x int)-- 查询临时表,其实有另外的名称,由系统自行管理维护的.
select name,id,crdate
from tempdb.dbo.sysobjects
where xtype='U' and name like '#temp%'name id crdate
------------------------ ----------- -----------------------
#temp______0000000002CD 383340430 2011-07-29 17:25:12.653
#temp______0000000002CE 399340487 2011-07-29 17:25:31.170
就像ls大哥说的一样 sql里面不同连线(session)可以有同名临时表的,
在tempdb里有另外的名称,由SQL Server自行管理的.
那么mysql了?
而且跟普通表的作用域一致的,这样就会有冲突.
在SQL中,全局临时表不行,和局部临时表不一样!会发生阻塞的。
但是我在测试的时候 如果不用全局的就会报对象名 '#temp' 无效。
不知道为什么会找不到这个#temp临时表?这是什么原因额?
--可以做个测试-->局部临时表测试
-->第一个查询窗口
begin tran
create table #tb(id int)
-->第二个查询窗口
create table #tb(id int)--发现:执行完第一个查询窗口后执行第二个窗口是可以成功的。-->全局临时表
--把上边的#tb换成##tb,发现第二个窗口会阻塞!
不知道大家如果是在mysql里面用到临时表是怎么处理的?
如果不用临时表 又怎么做?
MySQL中的临时表使用方法创建临时表很容易,给正常的CREATE TABLE语句加上TEMPORARY关键字:CREATE TEMPORARY TABLE tmp_table
(
name VARCHAR(10) NOT NULL,
value INTEGER NOT NULL
)
临时表将在你连接MySQL期间存在。
当你断开时,MySQL将自动删除表并释放所用的空间。
当然你可以在仍然连接的时候删除表并释放空间。DROP TABLE tmp_table如果在你创建名为tmp_table临时表时名为tmp_table的表在数据库中已经存在,
临时表将有必要屏蔽(隐藏)非临时表tmp_table。
如果你声明临时表是一个HEAP表,MySQL也允许你指定在内存中创建它:CREATE TEMPORARY TABLE tmp_table
(
name VARCHAR(10) NOT NULL,
value INTEGER NOT NULL
) TYPE = HEAP因为HEAP表存储在内存中,你对它运行的查询可能比磁盘上的临时表快些。
然而,HEAP表与一般的表有些不同,且有自身的限制。貌似和MS-SQL SERVER中差距不大。
存储过程中一般不创建全局临时表,除非是存储过程中包含有动态语句,
动态语句引用了临时表,并且这个临时表在结束了动态语句的执行后,
存储过程还要继续引用,这时必须要使用全局临时表了,
但存储过程的最后会删除这个全局临时表,并且在前面生成全局临时表时,
会生成一个当前库没有的全局临时表,避免冲突。
mysql只接触过一点点,具体怎么操作不太清楚
等等就结贴 问下大家
存储过程里面先执行这个动态语句(为临时表插如数据) 现在数据都成功了
为什么接下来的查询会什么都没有?是不是动态语句一执行完这个临时表就销毁了?
exec (@intotemp)
select * from #temp
exec('select 1 as c into #tb')select * from #tb/*********消息 208,级别 16,状态 0,第 3 行
对象名 '#tb' 无效。create table #tb(id int)exec('insert into #tb select 1')select * from #tbdrop table #tb/**********id
-----------
1(1 行受影响)