使用MySQL实现select into临时表的功能

目录
  • MySQL select into临时表
    • select into 临时表
    • create 临时表
  • mysql临时表(可以将查询结果存在临时表中)
    • 创建临时表可以将查询结果寄存
    • mysql把select结果保存为临时表,有2种方法

MySQL select into临时表

最近在编写sql语句时,遇到两次将数据放temp表,然后将两次的temp表进行inner join,再供后续insert数据时使用的场景。

写完后发现执行耗时较长,需要优化,于是将一条长长的sql语句拆分成一个sql脚本,用临时表去暂存数据后再进行inner join。

select into 临时表

首先想到的是使用select into这个写法:

select * into temp_test from user where id=007;

写完在Navicat执行报错,发现MySQL居然是不支持select into这种写法的,没办法,只能转换思路。

这个时候我又想起来有一个create table as select * from old_table的用法,想着是不是可以通过select出来的数据直接创建一张临时表。

写完去Navicat执行,这次又报错了:

Statement violates GTID consistency: CREATE TABLE ... SELECT.

搜索资料发现,由于MySQL在5.6及更高的版本添加了enforce_gtid_consistency这个参数,默认设置为true, 只允许保证事务安全的语句被执行。

没招儿,还得用原始方法去实现。

create 临时表

由于供后续使用的字段不超过十个,不算多,于是通过create方式创建表,后续使用数据后再删除这个表,逻辑上这就成了一个临时表。

大致的写法如下:

USE database;
-- 设置变量
SET @testCode='T001';
-- 创建临时表
DROP TABLE IF EXISTS temp_test;
CREATE TABLE IF NOT EXISTS `temp_test`(
`name` VARCHAR(255),
`caption` VARCHAR(255),
`order` INT(11),
...
`entityId` BIGINT(20)
);
INSERT INTO temp_test
select item.name,item.caption,item.order,item.id from item item
inner join base base on base.id=item.baseid
where base.num='test01'
and base.id='T01'
select id into @itemid from temp_test;
update user set systemid=@itemid where `code`=@testCode;
...
INSERT INTO `base` (`userId`,`entityId`,`name`,`caption`, ...)
SELECT tpitem.entityId,tpitem.CONCAT('pre_',tpitem.name),tpitem.caption,tpitem.order,...
from
(
select * from temp_test test inner join temp_test2 test2 on test.entityid=test2.entityid
) tpitem
WHERE NOT EXISTS (SELECT 1 FROM item WHERE `code`=@testCode limit 1);
-- 删除临时表
DROP TABLE temp_test;

mysql临时表(可以将查询结果存在临时表中)

创建临时表可以将查询结果寄存

报表制作的查询sql中可以用到。

(1)关于寄存方式,mysql不支持:select * into tmp from maintenanceprocess

(2)可以使用:

create table tmp (select ...)

举例:

#单个工位检修结果表上部

drop table if EXISTS tmp_单个工位检修结果表(检查报告)上部;
 
create table tmp_单个工位检修结果表(检查报告)上部 (select workAreaName as '机器号',m.jobNumber as '检修人员编号',u.userName as '检修人员姓名',loginTime as '检修开始时间',
 
CONCAT(FLOOR((TIME_TO_SEC(exitTime) - TIME_TO_SEC(loginTime))/60),'分钟') as '检修持续时长'
 
from maintenanceprocess as m LEFT JOIN user u ON m.jobNumber = u.jobNumber where m.jobNumber = [$检修人员编号] and loginTime = [$检修开始时间]);#创建临时表
 
select * from tmp_单个工位检修结果表(检查报告)上部;

备注:[$检修开始时间]是可输入查询的值

(3)创建临时表的另一种方式举例:

存储过程中:

BEGIN
 
#Routine body goes here...
 
declare cnt int default 0;   
 
declare i int default 0;   
 
set cnt = func_get_splitStringTotal(f_string,f_delimiter);   
 
DROP TABLE IF EXISTS `tmp_split`;   
 
create temporary table `tmp_split` (`val_` varchar(128) not null) DEFAULT CHARSET=utf8;   
 
while i < cnt   
 
do   
 
set i = i + 1;   
 
insert into tmp_split(`val_`) values (func_splitString(f_string,f_delimiter,i));   
 
end while;
 
END

mysql把select结果保存为临时表,有2种方法

第一种,建立正式的表,此表可供你反复查询

drop table if exists a_temp;
create table a_temp as
select 表字段名称 from 表名称

或者,建立临时表,此表可供你当次链接的操作里查询.

create temporary table 临时表名称
select 表字段名称 from 表名称

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

(0)

相关推荐

  • MySQL 内存表和临时表的用法详解

    内存表: session 1 $ mysql -uroot root@(none) 10:05:06>use test Database changed root@test 10:06:06>CREATE TABLE tmp_memory (i INT) ENGINE = MEMORY; Query OK, 0 rows affected (0.00 sec) root@test 10:08:46>insert into tmp_memory values (1); Query OK,

  • mysql的select into给多个字段变量赋值方式

    目录 mysql select into给多个字段变量赋值 mysql select into和insert into select 1.SELECT INTO FROM语句 2.INSERT INTO SELECT语句 mysql select into给多个字段变量赋值 在into之后顺序写上要赋值的变量就行 SELECT      c1, c2, c3, ... INTO      @v1, @v2, @v3,... FROM      table_name WHERE      cond

  • mysql中数据库覆盖导入的几种方式总结

    目录 部分覆盖 业务场景 应用方案 完全覆盖 业务场景 应用方案 总结 众所周知,数据库中INSERT INTO语法是append方式的插入,而最近在处理一些客户数据导入场景时,经常遇到需要覆盖式导入的情况 常见的覆盖式导入主要有下面两种: 1.部分覆盖:新老数据根据关键列值匹配,能匹配上则使用新数据覆盖,匹配不上则直接插入. 2.完全覆盖:直接删除所有老数据,插入新数据. 本文主要介绍如何在数据库中完成覆盖式数据导入的方法. 部分覆盖 业务场景 某业务每天给业务表中导入大数据进行分析,业务表中

  • 使用MySQL实现select into临时表的功能

    目录 MySQL select into临时表 select into 临时表 create 临时表 mysql临时表(可以将查询结果存在临时表中) 创建临时表可以将查询结果寄存 mysql把select结果保存为临时表,有2种方法 MySQL select into临时表 最近在编写sql语句时,遇到两次将数据放temp表,然后将两次的temp表进行inner join,再供后续insert数据时使用的场景. 写完后发现执行耗时较长,需要优化,于是将一条长长的sql语句拆分成一个sql脚本,用

  • 深度解析MySQL 5.7之临时表空间

    临时表 临时表顾名思义,就是临时的,用完销毁掉的表. 数据既可以保存在临时的文件系统上,也可以保存在固定的磁盘文件系统上. 临时表有下面几种: 1.全局临时表 这种临时表从数据库实例启动后开始生效,在数据库实例销毁后失效.在MySQL里面这种临时表对应的是内存表,即memory引擎. 2.会话级别临时表 这种临时表在用户登录系统成功后生效,在用户退出时失效.在MySQL里的临时表指的就是以create temporary table 这样的关键词创建的表. 3.事务级别临时表 这种临时表在事务开

  • 利用Mysql定时+存储过程创建临时表统计数据的过程

    1.mysql定时任务简单介绍 mysql的定时任务是使用event(事件)来实现的,自mysql5.1.6版本起,增加了这个功能 - 事件调度器(event scheduler),它可以精确到每秒钟执行一个任务,在一些对数据实时性要求比较高的场景非常使用,接下来我将用mysql的event事件来实现定时统计数据. 2.准备工作 (1)查看定时策略是否开启 show variables like '%event_sche%'; 执行结果如下 ON表示处于开启状态,如果是OFF则表示处于关闭状态,

  • MySQL进阶SELECT语法篇

    MySQL中SELECT语句的基本语法是:  SELECT [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [HIGH_PRIORITY] [DISTINCT|DISTINCTROW|ALL] select_list [INTO {OUTFILE|DUMPFILE} 'file_name' export_options] [FROM table_references [WHERE where_definition] [GROUP BY co

  • PHP+mysql实现的三级联动菜单功能示例

    本文实例讲述了PHP+mysql实现的三级联动菜单功能.分享给大家供大家参考,具体如下: 数据库mysql -- 数据库: `student` -- -- -------------------------------------------------------- -- -- 表的结构 `student` -- CREATE TABLE `student` ( `id` int(50) NOT NULL auto_increment, `name` varchar(50) collate u

  • Python操作mysql数据库实现增删查改功能的方法

    本文实例讲述了Python操作mysql数据库实现增删查改功能的方法.分享给大家供大家参考,具体如下: #coding=utf-8 import MySQLdb class Mysql_Oper: def __init__(self,host,user,passwd,db): self.host=host self.user=user self.passwd=passwd self.database=db def db_connecet(self): try: #连接 conn=MySQLdb.

  • PHP+MySQL实现模糊查询员工信息功能示例

    本文实例讲述了PHP+MySQL实现模糊查询员工信息功能.分享给大家供大家参考,具体如下: 一.代码 注意两点: 1.用Notepad+编辑时,格式选择:[编码字符集]->[中文]->[gb2312] 2. <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> conn.php <?php $connID=mysql_connect("lo

  • MySQL之select in 子查询优化的实现

    下面的演示基于MySQL5.7.27版本 一.关于MySQL子查询的优化策略介绍: 子查询优化策略 对于不同类型的子查询,优化器会选择不同的策略. 1. 对于 IN.=ANY 子查询,优化器有如下策略选择: semijoin Materialization exists 2. 对于 NOT IN.<>ALL 子查询,优化器有如下策略选择: Materialization exists 3. 对于 derived 派生表,优化器有如下策略选择: derived_merge,将派生表合并到外部查询

  • mysql使用自定义序列实现row_number功能(步骤详解)

    看了一些文章,终于知道该怎么在 mysql 里面实现 row_number() 排序 话不多说,show you the code: 第一步:建表: create table grades( `name` varchar(10), `subject` varchar(10), `score` int(10) ) 第二步:写入数据 insert into grades(name, subject, score) values('小明', '语文', 85), ('小华', '语文', 89), (

  • 一文带你学会MySQL的select语句

    目录 SQL概述 SQL背景知识 SQL语言排行榜 SQL 分类 SQL语言的规则与规范 基本规则 SQL大小写规范 (建议遵守) 注释 命名规则(暂时了解) 数据导入指令 基本的SELECT语句 SELECT... SELECT ... FROM 列的别名 去除重复行 空值参与运算 着重号 查询常数 总结 SQL概述 SQL背景知识 1946 年,世界上第一台电脑诞生,如今,借由这台电脑发展起来的互联网已经自成江湖.在这几十年里,无数的技术.产业在这片江湖里沉浮,有的方兴未艾,有的已经几幕兴衰

随机推荐