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 临时表插入的主要内容,如果未能解决你的问题,请参考以下文章

MySQL存储过程循环遍历变量并插入临时表

mysql创建临时表,将查询结果插入已有的表

尝试使用 UNION ALL 插入临时表

SQL临时表使用

SQL 从临时表插入表,并将输出插入临时表

在存储过程中创建临时表