MySQL临时表

本文深入探讨了SQL中临时表的特性、创建方法、与持久表的区别、使用限制及实例演示,帮助开发者掌握如何高效利用临时表进行数据处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 临时表简介

    通常情况下我们创建的表具有一个较长的生命周期,它使用CREATE TABLE语句创建,我们也称之为持久表。而有时候我们需要临时表,来临时存储复杂的select语句结果。

    临时表的生命周期较短,而且只能对创建它的session(当前连接)可见,当session退出时临时表被删除,也可使用drop table语句删除。在两个不同的链接里使用相同的临时表名不会产生冲突,它们只对当前session有效。

    临时表的名字可以和一个已有的持久表的名字相同,持久表不会被删除,但会被当前session的临时表隐藏。

    临时表和内存表都是数据存放在内存中(临时表表结构也在内存中,内存表表结构在磁盘上),临时表最大所需内存需要通过tmp_table_size = 1024M设定,内存表最大所需内存需要通过max_heap_table_size=1024M设定。当数据超过临时表的最大值设定时,自动转为基于磁盘的MyISAM表,存储在指定的tmpdir目录,此时因需要进行IO操作,性能会大大下降,而内存表不会,内存表满后,会提示数据满错误。

2 临时表创建

    2.1 创建语法

CREATE TEMPORARY TABLE ...
    2.2 例如:

mysql> create temporary table tmptable (c1 int, c2 int);
    当创建临时表后,会在操作系统/tmp文件夹下生成类似临时文件

[root@localhost tmp]# ls
#sqla5a_3_2.frm    
3  临时表操作

    3.1 插入数据

mysql> insert into tmptable values(1,2);
mysql> select * from tmptable;
+------+------+
| c1   | c2   |
+------+------+
|    1 |    2 |
+------+------+
    3.2 和持久表的对比

    在当前临时表所在的数据库下创建持久表

mysql> create table tmptable (c1 int);
mysql> show tables;
+-----------------+
| Tables_in_test1 |
+-----------------+
| tmptable        |
+-----------------+
mysql> insert into tmptable values(1);
ERROR 1136 (21S01): Column count doesn't match value count at row 1
    持久表创建成功,但被临时表隐藏,只显示一个表。
4 临时表删除

mysql> drop table tmptable;
mysql> show tables;
+-----------------+
| Tables_in_test1 |
+-----------------+
| tmptable        |
+-----------------+
mysql> insert into tmptable values(1);
mysql> select * from tmptable;
+------+
| c1   |
+------+
|    1 |
+------+
    临时表删除后持久表显示表现出来,并可对其操作。

5 临时表使用限制

    5.1 同一个query中,临时表只能被打开一次(持久表可以被多次打开),对比如下:

    持久表

mysql> select * from tmptable;
+------+
| c1   |
+------+
|    1 |
+------+
mysql> select * from tmptable, tmptable AS t2;
+------+------+
| c1   | c1   |
+------+------+
|    1 |    1 |
+------+------+

    临时表

mysql> select * from tmptable;
+------+------+
| c1   | c2   |
+------+------+
|    1 |    2 |
+------+------+
mysql> select * from tmptable, tmptable AS t2;
ERROR 1137 (HY000): Can't reopen table: 'tmptable'


**********************************************************************************************
 转载请注明出处:http://blog.youkuaiyun.com/jesseyoung/article/details/37809849
**********************************************************************************************


### 如何在 MySQL 中创建和使用临时表 #### 创建临时表MySQL 中,可以通过 `CREATE TEMPORARY TABLE` 语句来定义一个临时表。这种类型的表仅存在于当前会话期间,在会话结束时会被自动删除[^1]。 以下是创建临时表的一个具体例子: ```sql CREATE TEMPORARY TABLE temp_sales ( sale_id INT AUTO_INCREMENT PRIMARY KEY, sale_date DATE NOT NULL, product VARCHAR(50) NOT NULL, amount INT NOT NULL ); ``` 此代码片段展示了如何构建一个名为 `temp_sales` 的临时表,其中包含了销售记录的相关字段[^3]。 #### 向临时表中插入数据 一旦临时表被成功创建,可以像操作常规表一样向其插入数据。下面是一个简单的插入示例: ```sql INSERT INTO temp_sales (sale_date, product, amount) VALUES ('2023-09-01', 'Laptop', 1), ('2023-09-02', 'Smartphone', 2), ('2023-09-03', 'Tablet', 3); ``` 这些 SQL 命令将三条销售记录插入到刚刚创建的 `temp_sales` 表中。 #### 查询临时表中的数据 查询临时表的数据同样遵循标准的 SELECT 语法。例如,要查看所有的销售记录,可执行如下命令: ```sql SELECT * FROM temp_sales; ``` 这将返回所有已插入的销售记录条目。 #### 添加索引至临时表 为了提高性能,可以在临时表上建立索引来加速特定列上的查找过程。以下是如何为临时表添加索引的例子: ```sql ALTER TABLE temp_sales ADD INDEX idx_product (product); ``` 上述语句会在 `product` 列上增加一个普通索引。如果需要唯一约束,则可以用 UNIQUE 关键字替代 INDEX[^4]。 #### 解决与临时表相关的常见问题 当处理复杂的 SQL 操作时,可能会遇到因频繁创建大量临时文件而导致性能下降的情况。这种情况通常由复杂子查询或者大数据集引起。优化这类问题的方法之一是减少不必要的中间结果存储,并考虑调整服务器配置参数以适应更高的负载需求[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值