我正在使用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 ...此查询必须多次运行。是否可以使用临时表或导致服务器问题?
答案 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开销快得多。