【豆子,叶子,小F....】向所有数据库高手真心请教一个疑问

li358871791 2011-07-29 05:25:38
mysql存储过程里面如果用到一个临时表
存储过程里面有一个判断是这个临时表是否存在如果存在就删除然后在创建
我想问的是如果当一个用户操作调用到这个存储过程还未关闭连接时
另外一个用户也操作到这个存储过程了 那存储过程会去判断这个临时表是否存在
那么这时临时表肯定是存在的 就会执行删除操作 删掉以后会不会对前面一个用户造成影响?
如果有会是什么影响? sql里面如果用到这样会不会也有这种影响?
...全文
254 34 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
li358871791 2011-08-01
  • 打赏
  • 举报
回复
非常感谢园丁 豆子 晴天 叶子 唐诗三百首 谢谢大家的热心帮助 现在结贴
li358871791 2011-08-01
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 acherat 的回复:]
你在外部创建临时表,动态里面往临时表里插入数据,然后去查询会有的。


SQL code


exec('select 1 as c into #tb')

select * from #tb

/*********

消息 208,级别 16,状态 0,第 3 行
对象名 '#tb' 无效。




SQL code


create table #t……
[/Quote]
谢谢园丁 解决
-晴天 2011-08-01
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 li358871791 的回复:]
对不起大家 放假寝室没网
等等就结贴

SQL code


问下大家
存储过程里面先执行这个动态语句(为临时表插如数据) 现在数据都成功了
为什么接下来的查询会什么都没有?是不是动态语句一执行完这个临时表就销毁了?
exec (@intotemp)
select * from #temp
[/Quote]
用exec 执行时,会打开另一个会话(系统处理的,你不用去管它),在程序中写着 exec 语句的会话中建立的局部临时表,在 exec 语句打开的新会话中是找不到的.
AcHerat 2011-08-01
  • 打赏
  • 举报
回复
你在外部创建临时表,动态里面往临时表里插入数据,然后去查询会有的。


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 #tb

drop table #tb

/**********

id
-----------
1

(1 行受影响)

li358871791 2011-08-01
  • 打赏
  • 举报
回复
在请叶子 晴天 园丁 豆子出来帮忙下 等等就来结贴
li358871791 2011-08-01
  • 打赏
  • 举报
回复
对不起大家 放假寝室没网
等等就结贴

问下大家
存储过程里面先执行这个动态语句(为临时表插如数据) 现在数据都成功了
为什么接下来的查询会什么都没有?是不是动态语句一执行完这个临时表就销毁了?
exec (@intotemp)
select * from #temp
悔说话的哑巴 2011-07-30
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 mockqi 的回复:]
木有看见小F MM
[/Quote]
别人是男的,而且结婚了的,我狂汗。。。。。。。
  • 打赏
  • 举报
回复
木有看见小F MM
gahyyai 2011-07-30
  • 打赏
  • 举报
回复
mark
cd731107 2011-07-29
  • 打赏
  • 举报
回复
##是全局临时表,是公用的,一旦重启服务或被删除后就无法再引用了,
存储过程中一般不创建全局临时表,除非是存储过程中包含有动态语句,
动态语句引用了临时表,并且这个临时表在结束了动态语句的执行后,
存储过程还要继续引用,这时必须要使用全局临时表了,
但存储过程的最后会删除这个全局临时表,并且在前面生成全局临时表时,
会生成一个当前库没有的全局临时表,避免冲突。
mysql只接触过一点点,具体怎么操作不太清楚
叶子 2011-07-29
  • 打赏
  • 举报
回复

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中差距不大。
AcHerat 2011-07-29
  • 打赏
  • 举报
回复
不用临时表就把之前用临时表写的SQL中将临时表替换成创建的SQL语句即可,当做子查询。
li358871791 2011-07-29
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 acherat 的回复:]
楼主的临时表是在哪里创建的,如果是在存储过程、函数、触发器等这些里要写创建的语句。
[/Quote]
明白了 谢谢园丁额
不知道大家如果是在mysql里面用到临时表是怎么处理的?
如果不用临时表 又怎么做?
-晴天 2011-07-29
  • 打赏
  • 举报
回复
要在同一个会话里创建并使用局部临时表,会话结束,全局临时表消失,另启一个会话,会找不到该临时表的.
全局临时表可以在不同会话访问,但在并发时,不同的会话,对全局临时表的访问可能造成冲突.
AcHerat 2011-07-29
  • 打赏
  • 举报
回复
楼主的临时表是在哪里创建的,如果是在存储过程、函数、触发器等这些里要写创建的语句。
AcHerat 2011-07-29
  • 打赏
  • 举报
回复

--可以做个测试

-->局部临时表测试
-->第一个查询窗口
begin tran
create table #tb(id int)
-->第二个查询窗口
create table #tb(id int)

--发现:执行完第一个查询窗口后执行第二个窗口是可以成功的。

-->全局临时表
--把上边的#tb换成##tb,发现第二个窗口会阻塞!
li358871791 2011-07-29
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 acherat 的回复:]
引用 15 楼 li358871791 的回复:

引用 13 楼 acherat 的回复:
MYSQL不清楚,楼主是全局临时表?

嗯是的 这样有问题没?


在SQL中,全局临时表不行,和局部临时表不一样!会发生阻塞的。
[/Quote]

但是我在测试的时候 如果不用全局的就会报对象名 '#temp' 无效。
不知道为什么会找不到这个#temp临时表?这是什么原因额?
AcHerat 2011-07-29
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 li358871791 的回复:]

引用 13 楼 acherat 的回复:
MYSQL不清楚,楼主是全局临时表?

嗯是的 这样有问题没?
[/Quote]

在SQL中,全局临时表不行,和局部临时表不一样!会发生阻塞的。
li358871791 2011-07-29
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 acherat 的回复:]
MYSQL不清楚,楼主是全局临时表?
[/Quote]
嗯是的 这样有问题没?
唐诗三百首 2011-07-29
  • 打赏
  • 举报
回复
全局的临时表就不是在tempdb下了,是在当前DB里的,
而且跟普通表的作用域一致的,这样就会有冲突.
加载更多回复(13)

22,300

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧