美文网首页
【MySQL】浅析临时表和永久表同名引发的问题

【MySQL】浅析临时表和永久表同名引发的问题

作者: DATA无界 | 来源:发表于2017-09-04 18:49 被阅读0次

在ORACLE中,无论是永久表还是临时表,在同一个Schema中,只能有一个表名,不会存在临时表和永久表同名的问题。  而在MySQL中却不是这样的。

在执行MYSQL默认建表语句时,不会去检测当前是否有同名的临时表和永久表。

一、来看如下实验:

1、先创建一张普通表

mysql> create table a ( a int ,b int);

Query OK, 0 rows affected (0.03 sec)

mysql> desc a;

+-------+---------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+-------+---------+------+-----+---------+-------+

| a | int(11) | YES | | NULL | |

| b | int(11) | YES | | NULL | |

+-------+---------+------+-----+---------+-------+

2 rows in set (0.00 sec)

2、插入测试数据

mysql> insert into a select 1,2;

Query OK, 1 row affected (0.02 sec)

Records: 1 Duplicates: 0 Warnings: 0

mysql> insert into a select 3,4;

Query OK, 1 row affected (0.02 sec)

Records: 1 Duplicates: 0 Warnings: 0

mysql> select * from a;

+------+------+

| a | b |

+------+------+

| 1 | 2 |

| 3 | 4 |

+------+------+

2 rows in set (0.00 sec)

3、再创建一张同名的临时表(注意此时并未报错)

mysql>create temporary table a (t int);

Query OK, 0 rows affected (0.00 sec)

mysql> insert into a select 9;

Query OK, 1 row affected (0.00 sec)

Records: 1  Duplicates: 0  Warnings: 0

4、现在当前会话中就存在了2张同名的a表。

那么问题来了,如果此时查询表a的数据,MYSQL返回的会是永久表的数据还是临时表的数据呢?

继续实验:

mysql>select * from a;

+------+

| t    |

+------+

|    9 |

+------+

1 row in set (0.00 sec)

mysql>desc a;

+-------+---------+------+-----+---------+-------+

| Field | Type    | Null | Key | Default | Extra |

+-------+---------+------+-----+---------+-------+

| t    | int(11) | YES  |    | NULL    |      |

+-------+---------+------+-----+---------+-------+

1 row in set (0.00 sec)

5、可见,如果此时查询a表,那么将返回的数据将是临时表a的数据,而查询不到永久表a的数据。

那么如何查询表a的数据呢?  如果当前会话查不到,尝试新开一个会话查询下

新开会话查询:

mysql> select * from a;

+------+------+

| a    | b    |

+------+------+

|    1 |    2 |

|    3 |    4 |

+------+------+

2 rows in set (0.00 sec)

二、分析:

出现这种情况的原因在于:

在MySQL中存在两种临时表 外部临时表和内部临时表 。

通过CREATE TEMPORARY TABLE 创建的临时表被称为外部临时表。

这种临时表只对当前会话用户可见,当前会话结束的时候,该临时表会自动关闭。

这种临时表的表名与普通表可以同名,但是会导致同名后普通表将对当前会话不可见,直到临时表被删除。

内部临时表是一种特殊轻量级的临时表,用来进行性能优化。这种内部表对普通用户来说是不可见的。

三、解决方法:

1、定制开发和运维建表规范,采用不同表名,如所有临时表命名必须以tmp开头;

2、建表时统一采用建表参数【IF NOT EXISTS】,让MYSQL在建表时进行检测是否存在同名表,有则报错。

相关文章

  • 【MySQL】浅析临时表和永久表同名引发的问题

    在ORACLE中,无论是永久表还是临时表,在同一个Schema中,只能有一个表名,不会存在临时表和永久表同名的问题...

  • 创建表空间

    创建永久表空间, 注意不要创建到了临时表空间 会有很多问题 给用户分配表空间

  • oracle临时表

    临时表 ORACLE数据库除了可以保存永久表外,还可以建立临时表temporary tables。这些临时表用来保...

  • mysq临时表

    MySQL 临时表 MySQL 临时表在我们需要保存一些临时数据时是非常有用的。临时表只在当前连接可见,当关闭连接...

  • sql数据库管理

    分析,可以检索错误,然后没有bug,在点击执行 临时表 就是临时创建的表,存在缓存去,不能永久保存。本地临时表以#...

  • 【SQL】| Session、Transaction

    基于上次临时表的问题,我们提到了外部临时表的两种,基于session的临时表和基于transaction的临时表,...

  • mysql中常见的引擎介绍及使用

    MySQL常用的存储引擎之MyISAM myisam是大多数系统表和临时表使用的存储引擎 这里的临时表不是平常所说...

  • MySQL 临时表

    临时表只在当前连接可见,当关闭连接时,Mysql会自动删除表并释放所有空间。 使用PHP脚本来创建MySQL临时表...

  • mysql 临时表

    EXPLAIN 执行计划中 Extra中有包含using temptable的话就会创建临时表。

  • MYSQL临时表

    1.简介: 用于临时存储大量数据子集的查询结果,经行临时存储以便下一步处理; 相对于执行若干次查询操作每次经行SQ...

网友评论

      本文标题:【MySQL】浅析临时表和永久表同名引发的问题

      本文链接:https://www.haomeiwen.com/subject/swpddxtx.html