mysql临时表插入数据方式

 更新时间:2022年09月26日 11:10:38   作者:屿舟  
这篇文章主要介绍了mysql临时表插入数据方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

mysql临时表插入数据

临时表

1.在数据库断开连接的时候会自动删除临时表。

 create temporary table IF NOT EXISTS client.getstucou(
  type_id int
 )Engine=InnoDB default charset utf8;

注意:在存储过程中创建了临时表的情况的话,在外面使用查询语句是找不到这张表的。

例如:

在存储过程中的sql语句中才而能找到该表。

2.临时表插入(select语句查出的数据集合)。INSERT INTO 表名 (查询到的集合)

例如:UNION ALL(将两个select语句求并集)

INSERT INTO getstucou 
 WITH TEMP AS (
  SELECT
  *
  FROM
  t_shop_type
  WHERE
  parent_type_id = @StuNo
  OR type_id
  = @StuNo
  UNION ALL
  SELECT
  t.*
  FROM
  TEMP,
  t_shop_type t
  WHERE
  TEMP.type_id = t.parent_type_id
  ) SELECT
  type_id 
  FROM
  TEMP;

mysql中临时表(TEMPORARY)

首先来看看官网给的有关MySQL的临时表的简介:

In MySQL, a temporary table is a special type of table that allows you to store a temporary result set, which you can reuse several times in a single session.A temporary table is very handy when it is impossible or expensive to query data that requires a single SELECT statement with the JOIN clauses. In this case, you can use a temporary table to store the immediate result and use another query to process it.

总结而来就是:

当我们需要使用难以接受的或开销很大的一个SELECT语句和JOIN子句的数据时,临时表非常方便。

语法

大致同CREATE TABLE语法,创建临时表则是CREATE TEMPORARY TABLE,增加了TEMPORARY关键字表示临时表。

1.创建

(1)创建不同于现有表的临时表

CREATE TEMPORARY TABLE table_name(
   column_1_definition,
   column_2_definition,
   ...,
   table_constraints
);

实例:

//首先,创建一个新的临时表,称为credits存储客户的信用:
CREATE TEMPORARY TABLE credits(
    customerNumber INT PRIMARY KEY,
    creditLimit DEC(10,2)
);
//然后,将customers表中的行插入临时表中credits:
INSERT INTO credits(customerNumber,creditLimit)
SELECT customerNumber, creditLimit
FROM customers
WHERE creditLimit > 0;

(2)创建结构基于现有表的临时表

不能使用该CREATE TEMPORARY TABLE … LIKE语句。而是,使用以下语法:

CREATE TEMPORARY TABLE temp_table_name
SELECT * FROM original_table
LIMIT 0;

实例:

//下面的示例创建一个临时表,该表按收入存储前10名客户。临时表的结构是从以下SELECT语句派生的:
CREATE TEMPORARY TABLE top_customers
SELECT p.customerNumber, 
       c.customerName, 
       ROUND(SUM(p.amount),2) sales
FROM payments p
INNER JOIN customers c ON c.customerNumber = p.customerNumber
GROUP BY p.customerNumber
ORDER BY sales DESC
LIMIT 10;
//从top_customers临时表中查询数据,就像从永久表中查询一样:
SELECT 
    customerNumber, 
    customerName, 
    sales
FROM
    top_customers
ORDER BY sales;

2.删除

可以通过DROP TABLE语句删除临时表,但不推荐这样,因为当临时表与永久表同名时,有可能会误删永久表,当然若你已经准备好机票,我就祝你一路顺风吧!若你未曾准备好机票,这里也给你提供中航订票电话:0086-95583 | 0086-10-95583,祝你好运!

推荐:

DROP TEMPORARY TABLE table_name;

注意:

(1)如果尝试使用该DROP TEMPORARY TABLE语句删除永久表,则会收到一条错误消息,提示您尝试删除的表是未知的。愉快地避免删表的误操作了。

(2)如果开发使用连接池或持久连接的应用程序,则不能保证在终止应用程序时自动删除临时表。因为该应用程序使用的数据库连接可能仍处于打开状态,并放置在连接池中,以便其他客户端以后再使用。因此,一个好习惯是在不再使用临时表时始终删除它们。

(3)在采用连接池的情况下,为防止多次CREATE 、 DROP TEMPORARY TABLE带来的性能瓶颈,可以使用CREATE IF NOT EXISTS + TRUNCATE TABLE 的方式来提升性能。(注意:IF NOT EXISTS是在TABLE之后,table_name之前的。)

功能

(1)通过使用CREATE TEMPORARY TABLE语句创建一个临时表。请注意,该关键字TEMPORARY已添加到CREATE和TABLE关键字之间 。

(2)当会话结束或连接终止时,MySQL自动删除临时表。当然,您可以在DROP TABLE不再使用临时表时使用该 语句显式删除该临时表。

(3)临时表仅对创建它的客户端可用并且可以访问。不同的客户端可以创建具有相同名称的临时表而不会导致错误,因为只有创建临时表的客户端才能看到它。但是,在同一会话中,两个临时表不能共享相同的名称。

(4)临时表可以与数据库中的普通表具有相同的名称。例如,如果您创建一个employees在示例数据库中命名的临时表,则现有employees表将变得不可访问。您针对该employees表发出的每个查询现在都引用该临时表 employees。当您删除employees临时表时,永久employees表可用且可访问。

但即使临时表可以与永久表具有相同的名称,也不建议使用。因为这可能导致混乱并可能导致意外的数据丢失。例如,如果与数据库服务器的连接丢失并且您自动重新连接到服务器,则无法区分临时表和永久表。然后,您可以发出一条DROP TABLE 语句删除永久表而不是临时表,这是不期望的。为避免此问题,可以使用该DROP TEMPORARY TABLE语句删除临时表。

检查是否存在临时表

MySQL不提供直接检查临时表是否存在的函数或语句。但是,我们可以创建一个存储过程来检查临时表是否存在,如下所示:

DELIMITER //
CREATE PROCEDURE check_table_exists(table_name VARCHAR(100)) 
BEGIN
    DECLARE CONTINUE HANDLER FOR SQLSTATE '42S02' SET @err = 1;
    SET @err = 0;
    SET @table_name = table_name;
    SET @sql_query = CONCAT('SELECT 1 FROM ',@table_name);
    PREPARE stmt1 FROM @sql_query;
    IF (@err = 1) THEN
        SET @table_exists = 0;
    ELSE
        SET @table_exists = 1;
        DEALLOCATE PREPARE stmt1;
    END IF;
END //
DELIMITER ;
//在此过程中,我们尝试从临时表中选择数据。如果临时表存在,则将该@table_exists变量设置为1,否则,将其设置为0。
//该语句调用check_table_exists来检查临时表是否credits 存在:
CALL check_table_exists('credits');
SELECT @table_exists;
//根据输出判断临时表是否存在

与MEMORY比较

我们知道还有一种通过存储引擎创建临时表的方式ENGINE|TYPE = MEMORY,这种方式创建的临时表是在内存中的,效率在理论上是比TEMPORARY更高的,因为MEMORY是在内存中,TEMPORARY是同永久表在磁盘上的。

实例:

CREATE TEMPORARY TABLE table_name(
   column_1_definition,
   column_2_definition,
   ...,
   table_constraints
) ENGINE|TYPE = MEMORY;

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • MySQL随机查询记录的效率测试分析

    MySQL随机查询记录的效率测试分析

    以下的文章主要介绍的是MySQL使用rand 随机查询记录效率测试,我们大家一直都以为MySQL数据库随机查询的几条数据,就用以下的东东,其实其实际效率是十分低的
    2011-06-06
  • MySQL5.5版本安装与安装失败详细讲解

    MySQL5.5版本安装与安装失败详细讲解

    MySQL是一款安全、跨平台、高效的,并与PHP、Java等主流编程语言紧密结合的数据库系统,下面这篇文章主要给大家介绍了关于MySQL5.5版本安装与安装失败详细讲解的相关资料,需要的朋友可以参考下
    2023-03-03
  • 开启bin-log日志mysql报错的解决方法

    开启bin-log日志mysql报错的解决方法

    开启bin-log日志mysql报错:This function has none of DETERMINISTIC, NO SQL解决办法,大家参考使用吧
    2013-12-12
  • MySQL在线DDL工具 gh-ost的原理解析

    MySQL在线DDL工具 gh-ost的原理解析

    这篇文章主要介绍了MySQL在线DDL工具 gh-ost,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • jdbc调用mysql存储过程实现代码

    jdbc调用mysql存储过程实现代码

    接下来将介绍下mysql存储过程的创建及调用,调用时涉及到jdbc的知识,不熟悉的朋友还要温习下jdbc哦,话不多说看代码,希望可以帮助到你
    2013-03-03
  • MySQL循环语句之while循环测试

    MySQL循环语句之while循环测试

    MySQL有循环语句操作,while 循环、loop循环和repeat循环,目前我只测试了 while 循环,下面与大家分享下
    2014-07-07
  • MySQLBackup备份数据库的操作过程

    MySQLBackup备份数据库的操作过程

    这篇文章主要介绍了MySQLBackup备份数据库的操作过程,包括安装部署和配置备份管理员的相关知识,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-03-03
  • MySQL表分区配置入门指南

    MySQL表分区配置入门指南

    这篇文章主要为大家介绍了MySQL表分区配置入门指南,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • mysql5.6主从搭建以及不同步问题详解

    mysql5.6主从搭建以及不同步问题详解

    大家好,本篇文章主要讲了mysql5.6主从搭建以及不同步问题详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • mysql的基础语句和外键查询及其语句详解(推荐)

    mysql的基础语句和外键查询及其语句详解(推荐)

    这篇文章主要介绍了mysql的基础语句和外键查询及其语句详解(推荐),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2025-04-04

最新评论