我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

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 表名称

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

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MySQL中临时表的使用示例

这两天事情稍微有点多,公众号也停止更新了几天,结果有读者催更了,也是,说明还是有人关注,利己及人,挺好。 今天分享的内容是MySQL中的临时表,对于临时表,之前我其实没有过多的研究,只是知道MySQL在某些特定场景下会使用临
2022-05-22

MySQL WITH AS创建临时表的实现

目录一、WITH AS 方法的基本语法二、使用 WITH AS 创建临时表的案例三、WITH AS的优势在mysql中,我们可以通过WITH AS方法创建临时结果集,这些结果集可以在后续的SELECT、DELETE和UPDATE语句中被使用
MySQL WITH AS创建临时表的实现
2024-08-31

mysql临时表的使用方法是什么

在MySQL中,临时表是一种特殊类型的表,它只在当前会话中存在并且在会话结束时会自动被销毁。临时表对于临时存储中间结果或者处理大量数据时非常有用。创建临时表的语法如下:CREATE TEMPORARY TABLE temp_table_
mysql临时表的使用方法是什么
2024-04-09

MySQL临时表使用的方法是什么

在MySQL中,可以使用以下方法创建和使用临时表:使用CREATE TEMPORARY TABLE语句创建临时表:CREATE TEMPORARY TABLE temp_table_name (column1 datatype,column
MySQL临时表使用的方法是什么
2024-05-06

怎么使用elementui的select实现多选添加功能

今天小编给大家分享一下怎么使用elementui的select实现多选添加功能的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。
2023-07-05

使用PHPMailer实现邮件的实时发送功能

本指南详细介绍了如何使用PHPMailer实现电子邮件实时发送功能,简化了电子邮件发送流程,并提供了对高级功能的访问。通过使用异步发送和处理发送事件,可以实现实时发送。同时,遵循一些最佳实践,如使用可靠的SMTP提供商和优化电子邮件大小,可以增强电子邮件发送性能。
使用PHPMailer实现邮件的实时发送功能
2024-04-02

如何使用MySQL和Ruby实现一个简单的时钟功能

如何使用MySQL和Ruby实现一个简单的时钟功能时钟功能在各种应用中经常会被使用到,它可以帮助我们记录时间、计时、定时等。在本文中,我们将介绍如何使用MySQL和Ruby来实现一个简单的时钟功能,并提供相应的代码示例。首先,我们需要创建一
2023-10-22

如何使用vue实现计时器功能

小编给大家分享一下如何使用vue实现计时器功能,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!具体内容如下首先我们要知道setTimeout和setInterval的区别setTimeout只在指定时间后执行一次,代码如下:
2023-06-20

编程热搜

目录