创建的MySQL临时表对于访问创建脚本的每个用户是否唯一?

11

当我寻找一种在用户在特定日期之间免费搜索酒店时临时保存搜索结果的方式时,我发现了临时表。

但是某些问题甚至在mysql手册中都没有得到解答.... 比如...

  1. 临时表对于每个执行脚本的用户是否唯一?还是当两个不同的用户同时运行脚本时会被覆盖...?

  2. 表什么时候被销毁..?当用户关闭浏览器窗口或只是从运行脚本的页面中导航开去..?

感谢您的澄清...

这就是我是如何做的....

$table = "CREATE OR REPLACE TEMPORARY TABLE $free_room(
              room_id INT(5),
              room_name VARCHAR(150),
              max_persons INT(1),
              rooms_free INT(1),
              room_price INT(6),
              hotel_id INT(4),
              hotel_name VARCHAR(100),
              hotel_stars INT(1),
              hotel_type INT(1)) ENGINE=MEMORY";

    $query_getFreeRooms = "INSERT INTO  $free_room
                           SELECT $rooms.room_id,
                                  $rooms.room_name,
                                  $rooms.max_persons,
                                  $rooms.total_rooms - $rooms.booked_rooms AS rooms_free,
                                  $rooms.room_price,
                                  $hotels.hotel_id,
                                  $hotels.hotel_name,
                                  $hotels.hotel_stars,
                                  $hotels.hotel_type
                           FROM   $hotels,$rooms
                           WHERE  $rooms.room_id NOT IN (SELECT room_id
                                                         FROM   $reservations
                                                         WHERE  $dateCheck)
                           AND    $hotels.hotel_city = '$city_search1'
                           AND    $hotels.hotel_id = $rooms.hotel_id
                           AND    $hotels.hotel_deleted = '0'
                           AND    $rooms.room_deleted = '0'";
1个回答

32
引用MySQL CREATE TABLE 的官方文档:

在创建表时,可以使用关键字TEMPORARY
TEMPORARY表只对当前连接可见,并且在连接关闭时会自动删除
这意味着两个不同的连接可以使用相同的临时表名字而不会相互冲突,也不会与同名的非TEMPORARY表发生冲突。

考虑到两个用户将有两个不同的连接,因此该表对每个用户都是唯一的。

当创建表的连接关闭时,临时表将被删除——至少在PHP中,这意味着在生成页面的脚本结束之后就会被删除 (因此通常在用户实际阅读页面之前)


1
但当我在线测试时,第一个用户创建的表仍然对在他之后访问它的所有用户可用...!!! 每个用户都不会创建一个新表... - SpikETidE
1
那么也许你正在以某种方式使用连接池? - nos
连接池...作为一个新手,我不了解这个概念...我会先查一下。 - SpikETidE
它可以工作了,只需要微调一下代码...已经运行起来了...感谢你的回复,马丁...+1并接受答案... - SpikETidE
@Martin:如果引用*(我明确说明这是一个引用,并提供了源链接)*一个短摘要会引起很多麻烦,我会感到惊讶;;; @SpikE:好的;很高兴你找到了解决方案 :-) - Pascal MARTIN
1
我看到你可以创建一个与永久表同名的临时表,我测试过了,确实可以。但是在后续的SQL语句中,我该如何指定要使用哪个表呢?手册上继续说道:在临时表被删除之前,现有的表将被隐藏。 - sdfor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接