使用MySQL实现select into临时表的功能
作者:三爷麋了鹿 发布时间:2024-01-25 01:14:53
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 表名称
来源:https://blog.csdn.net/u800820/article/details/121322445


猜你喜欢
- 当你检查scrapy二进制文件时,你会注意到这么一段python script#!/usr/bin/pythonfrom scrapy.cm
- 淘宝招聘的一个css题目:css样式控制div水平垂直居中方法;<!DOCTYPE html PUBLIC "-//W3C/
- Oracle基本PLSQL的使用实例详解PL/SQL 块是在 SQL 语言之上发展起来的一种应用,可以集中的处理各种复杂的 SQL 操 作。
- 我们目前生活在Python 3.8的稳定时代,上周发布了Python的最新稳定版本3.8.4。 Python 3.9已经处于其开发的beta
- MySQL是一个多线程的,结构化查询语言(SQL)数据库服务器。SQL在世界上是最流行的数据库语言。MySQL的执行性能非常高,运行速度非常
- select a.*,b.SumPoint from Expert_Topic_Index a,(
- 1、配置环境支持python2和python3On Linux, Solaris, or FreeBSD, add the /usr/loc
- 一、界面介绍文件导航区域 能够 浏览/定位/打开 项目文件文件编辑区域 能够 编辑 当前打开的文件控制台区域 能够:输出程序执行内容跟踪调试
- 返回首页的链接地址,有三种方法:1、一般方法是,直接写对应的域名地址,<a href="http://www.zfnn.co
- 我使用多进程的一般方式,都是multiprocessing模块中的Pool.map()方法。下面写一个简单的示例和解析。至于此种方法使用多进
- 前言上一次做了路由的相关配置,原本计划今天要做vuex部分,但是想了想,发现vuex单独的客户端部分穿插解释起来很麻烦,所以今天改做服务端部
- 字典是另一种可变容器模型,且可存储任意类型对象。字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,
- 1、使用argparse组件,获取命令行参数;使用re组件,获取需要查找的字符串所在行2、使用pandas组件,对文件进行排序。3、命令行执
- 总是记不住API。昨晚写的时候用到了这些,但是没记住,于是就索性整理一下吧:python中对文件、文件夹(文件操作函数)的操作需要涉及到os
- 除了数字,Python中最常见的数据类型就是字符串,无论那种编程语言,字符串无处不在。例如,从用户哪里读取字符串,并将字符串打印到屏幕显示出
- 本文实例为大家分享了python opencv实现图像矫正的具体代码,供大家参考,具体内容如下问题简介一般的我们对图像中的目标进行分析和检测
- 如图,以该猫咪图片为例(忽略水印)。将该文件命名为cat.jpg,并对其展开以下操作。使用PIL库进行灰度处理PIL库适合图像归档和图像批量
- 什么是 docopt?1、docopt 是一种 Python 编写的命令行执行脚本的交互语言。它是一种语言!它是一种语言!它是一种语言!2、
- 我们都知道ACCESS是ASP的亲密伙伴。因为两种最简单的东西碰在一起总能迸发出火花。然而,当我们过滤不严格的时候经常出现日文字符,这个时候
- 代码如下:declare @cmd nvarchar(4000) set @cmd = N'exec [?].sys.sp_chan