MySQL临时表插入

时间:2015-10-31 17:33:25

标签: mysql

我正在使用MySQL并尝试创建临时表。我将在PHP中使用2 while循环语句来填充临时表。首先,虽然我似乎无法将Insert插入临时表中。我尝试了很多不同的版本,有些使用'#'对于表和各种事物(SQL服务器和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";

帮助表示赞赏!

此外,只是一般Q ...此查询必须多次运行。是否可以使用临时表或导致服务器问题?

2 个答案:

答案 0 :(得分:0)

您可以按以下方式创建临时表并插入select statemet:

create temporary table temp
SELECT aID, bID
FROM tags
WHERE placeID = "abc" AND tagID = "def";

要在再次创建临时表之前删除它。在创建临时表之前输入以下语句:

drop temporary table if exists temp;

注意:如果您可以将所有这些代码放在存储过程中,那将会很好。并调用它来创建临时表。

答案 1 :(得分:0)

研究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这个简单主题上稍微流畅之前,不应该开始编写存储过程。在名为分隔符here部分中写下了这些内容。只是希望能在这么简单的事情上避免不必要的浪费时间,而不是浪费大量的调试时间。

此外,在您的问题以及该引用中,请记住,表格的创建是 DDL 可以占整体的很大比例剖析(性能)。与使用预先存在的表相比,它减慢了proc的速度。人们可能会认为这个电话是即时的,但事实并非如此。因此,为了提高性能,使用预先存在的表和一个结果放入它们自己的分段rowId比持久的DDL开销快得多。