MySQL 临时表插入
Posted
技术标签:
【中文标题】MySQL 临时表插入【英文标题】:MySQL Temp table Insert 【发布时间】:2016-01-31 23:20:29 【问题描述】:我正在使用 mysql 并尝试创建一个临时表。我将在 php 中执行 2 个 while 循环语句来填充临时表。首先,虽然我似乎无法让插入临时表工作。我已经尝试了许多不同的版本,有些使用'#'作为表和各种东西(SQL server 和 MySQL 命令有区别吗?)。这是我的最后一次尝试(P.S Select 语句本身就可以正常工作)。
CREATE TEMPORARY TABLE temp
(
aID varchar(15) NOT NULL,
bID varchar(15) NOT NULL
)
INSERT INTO temp
SELECT aID, bID
FROM tags
WHERE placeID = "abc" AND tagID = "def";
帮助表示赞赏!
另外,只是一个一般性的问题...这个查询必须运行很多次。使用临时表会不会导致服务器问题?
【问题讨论】:
您可以在重新创建临时表之前删除它。 如果我删除它,该表将不存在,如果我使用以前从未使用过的另一个表名,它仍然无法工作。我的查询有问题。 仅在存在时才删除:drop temporary table if exists temp;
没关系,我可以使用任何随机表名。结果相同。
添加了phpmyadmin
标签。祝斯图尔特好运
【参考方案1】:
处理 Code-Monk 所写的内容,请考虑以下几点:
drop procedure if exists uspK;
DELIMITER $$
create procedure uspK ()
BEGIN
drop temporary table if exists temp; -- could be some other random structure residue
create temporary table temp
SELECT aID, bID
FROM tags
WHERE placeID = "abc" AND tagID = "def";
-- use the temp table somehow
-- ...
-- ...
-- ...
drop temporary table temp; -- otherwise it survives the stored proc call
END
$$ -- signify end of block
DELIMITER ; -- reset to default delimiter
测试存储过程
call uspK(); -- test it, no warnings on edge conditions
什么不能做
一个人不会在以下情况下找到很多运气。如果你这么认为,运行几次;
drop procedure if exists uspK;
DELIMITER $$
create procedure uspK ()
BEGIN
-- drop temporary table if exists temp;
create temporary table if not exists temp
SELECT aID, bID
FROM tags
WHERE placeID = "abc" AND tagID = "def";
-- use the temp table somehow
-- ...
-- ...
-- ...
-- drop temporary table temp; -- otherwise it survives the stored proc call
END
$$ -- signify end of block
DELIMITER ; -- reset to default delimiter
因为create temporary table if not exists temp
是易碎的
一般评论
在对 DELIMITERS 的简单主题有所了解之前,不应着手编写存储过程。在名为 Delimiters 的部分 here 中写到了它们。只是希望避免在这么简单的事情上浪费不必要的时间,而不是浪费大量的调试时间。
此外,在您的问题以及该参考文献中,请记住,表的创建是 DDL,可以在总体中占很大比例分析(性能)。与使用预先存在的表相比,它会减慢 proc。有人可能认为呼叫是即时的,但事实并非如此。因此,为了提高性能,使用预先存在的表并将结果放入自己的分段 rowId 比忍受 DDL 开销要快得多。
【讨论】:
所以也许问题是我是怎么做的?所以我是新手,所以我在 myphpadmin 中测试我的查询。所以我只是在那里运行它。上面的代码是什么? php?这不是我可以在 myphpadmin 中使用的东西。 不,直接 sql,没有 PHP。它被称为Stored Proc,嵌入到您的数据库中,您可以使用call
调用它
所以你的任务是在use the temp table somehow
部分添加一些有价值的东西:)
我无法在 myphpadmin 中运行它,所以我正在做的事情与你正在做的事情不一样......
请注意,取决于您的版本,请参阅this。我不使用那种东西,老板。太局限了:)【参考方案2】:
您可以通过以下方式创建临时表并插入选择语句:
create temporary table temp
SELECT aID, bID
FROM tags
WHERE placeID = "abc" AND tagID = "def";
在再次创建临时表之前删除它。在创建临时表之前添加以下语句:
drop temporary table if exists temp;
注意:如果您可以将所有这些代码放在存储过程中,那就太好了。并调用它来创建临时表。
【讨论】:
以上是关于MySQL 临时表插入的主要内容,如果未能解决你的问题,请参考以下文章