2016-05-16 37 views
0

我需要在一個過程中創建一個臨時表。
現在我的步驟是:
1. DROP TEMPORARY TABLE如果不存在
2.創建TEMPORARY TABLE
3.做一些與表
4. DROP TEMPORARY TABLE如果不存在如何在MySQL中輕鬆選擇臨時表?

我不想每次調用該過程時創建臨時表。
我只是想截斷臨時表,但如何選擇一些數據到現有的臨時表?

如何使吹煉程序運行得更快?

DROP PROCEDURE IF EXISTS `test`; 
DELIMITER ;; 
CREATE PROCEDURE `test`(IN type INT) 
begin 

DECLARE done INT DEFAULT 0; 
DECLARE total INT DEFAULT 0; 
DECLARE min_1 INT DEFAULT 0; 
DECLARE min_10 INT DEFAULT 0; 
DECLARE min_30 INT DEFAULT 0; 
DECLARE tmp INT DEFAULT 0; 
DECLARE cursor1 CURSOR FOR SELECT TIMESTAMPDIFF(MINUTE,time1,time2) as dif FROM t_test ; 
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; 

DROP TEMPORARY TABLE if EXISTS t_test; 
CREATE TEMPORARY TABLE t_test AS (
    SELECT optime as time1,dtime as time2 
    FROM tbmytest 
    WHERE thetpye = type); 

OPEN cursor1; 
REPEAT 
FETCH cursor1 INTO tmp; 
IF done = 1 THEN 
    close cursor1; 
ELSE 
    SET total = total + 1; 
    IF tmp > 30 THEN 
    SET min_30 = min_30 + 1; 
    ELSEIF tmp > 10 THEN 
    SET min_10 = min_10 + 1; 
    ELSEIF tmp > -1 THEN 
    SET min_1 = min_1 + 1; 
    END IF; 
END IF; 
UNTIL done END REPEAT; 

DROP TEMPORARY TABLE if EXISTS t_test; 
SELECT min_1,min_10,min_30,total; 
end;; 
DELIMITER ; 
+0

不知道MySQL,但通常臨時表的會話結束後 –

+0

自我毀滅,我不知道你是否可以期待每次 –

+0

這就是臨時表用於列是相同的。 – Raptor

回答

0

遊標非常非常慢。臨時表可能不是必需的。

您可以實現與單個查詢中的過程相同的操作。爲此使用變量。以下查詢應該完成這項工作。

SELECT @min30, @min10, @min1 FROM (
    SELECT @diff := TIMESTAMPDIFF(MINUTE,time1,time2), 
    CASE WHEN @diff > 30 THEN @min30 := @min30 + 1 
     WHEN @diff > 10 THEN @min10 := @min10 + 1 
     WHEN @diff > -1 THEN @min1 := @min1 + 1 
    END 
    FROM t_test 
    CROSS JOIN (SELECT @diff := NULL, @min1 := 0, @min10 := 0, @min30 := 0) var_init_subquery 
) another_subquery_alias 

我不知道你的問題是否簡化了,也就是說你也需要臨時表作其他用途。如果是這樣,而不是刪除和創建表格,您還可以使用帶有MEMORY引擎的表格,並在需要時稍後更新一次。

CREATE TABLE my_special_temp_table 
(min30 int, min10 int, min1 int) 
ENGINE=MEMORY; 

UPDATE my_special_temp_table 
JOIN (
    SELECT @min30 AS min30, @min10 AS min10, @min1 AS min1 FROM (
     SELECT @diff := TIMESTAMPDIFF(MINUTE,time1,time2), 
     CASE WHEN @diff > 30 THEN @min30 := @min30 + 1 
      WHEN @diff > 10 THEN @min10 := @min10 + 1 
      WHEN @diff > -1 THEN @min1 := @min1 + 1 
     END 
     FROM t_test 
     CROSS JOIN (SELECT @diff := NULL, @min1 := 0, @min10 := 0, @min30 := 0) var_init_subquery 
    ) another_subquery_alias 
) t 
SET my_special_temp_table.min30 = t.min30, 
my_special_temp_table.min10 = t.min10, 
my_special_temp_table.min1 = t.min1;