如何理解存储过程中的MySQL临时表已经存在?

6
我使用mysql临时表在多个存储过程之间共享中间数据。所有这些过程都使用单个数据库连接。 在每个存储过程中,我需要确定mysql临时表是否已经存在。如果它已经存在,则我将使用它的值;否则,该存储过程将创建和填充临时表,其他存储过程(当然是在同一连接上)将使用临时表结果。
但是,我不知道如何检查临时表是否已经存在,我指的是像这样的东西:
IF temporaryTablename EXISTS THEN
   ...
ELSE
   ...
END IF;

有什么想法吗?


我想尝试在表上执行DESCRIBE,然后检查返回的SQLCODE(我认为这可以在存储过程中完成)。不确定如果你执行create / if not exists,无论是否创建了表,你是否会得到不同的SQLCODE。 - Kickstart
3个回答

7

在创建表时,您可以使用IF NOT EXISTS选项(参见13.1.17.CREATE TABLE Syntax),在这种情况下使用此选项。

例如:

DELIMITER $$

CREATE PROCEDURE `temp_sp1`()
BEGIN
    CREATE TEMPORARY TABLE IF NOT EXISTS `temp_table` (
      `col2` int(11) DEFAULT NULL,
      `col3` int(11) DEFAULT NULL
    );
    INSERT INTO `temp_table` (`col2`, `col3`) VALUES (4, 5);
    SELECT `col2`, `col3` FROM `temp_table`;
END$$

DELIMITER ;

SQL Fiddle演示

更新

...
DECLARE `no_such_table` TINYINT(1) DEFAULT 0;
DECLARE CONTINUE HANDLER FOR SQLSTATE VALUE '42S02' SET `no_such_table` := 1;
DO (SELECT NULL FROM `temp_table` LIMIT 0);
IF (`no_such_table`) THEN
   ...  
ELSE
   ...  
END IF;
...

1
这不是我的答案问题,我想只有在表不存在的情况下才插入值,但是这里没有提供任何检查它的方法。 - Ehsan Khodarahmi
@EhsanKhodarahmi:我确实没有理解你的问题。希望这个更新能够帮助到你。 - wchiquito

3
由于某些原因,wchiquito的更新对我不起作用,所以我将其修改为以下内容:
CREATE PROCEDURE check_table_existence (IN table_name CHAR(64))
BEGIN
    DECLARE CONTINUE HANDLER FOR SQLSTATE '42S02' SET @err = 1;
    SET @err = 0;
    SET @table_name = table_name;
    SET @sql_query = CONCAT('SELECT NULL FROM ',@table_name);
    PREPARE stmt1 FROM @sql_query;
    IF (@err = 1) THEN
        SET @table_exists = 0;
    ELSE
        SET @table_exists = 1;
        DEALLOCATE PREPARE stmt1;
    END IF;
END

然后:

CALL check_table_existence('existent_table');
SELECT @table_exists;

提供

+---------------+
| @table_exists |
+---------------+
|             1 |
+---------------+

并且为0,否则为0。

这也是一种解决方法,但对我来说效果很好。 它也适用于临时表。


-1

我使用这个:

CREATE FUNCTION `TableExists`(tableName text) RETURNS bit(1)
    DETERMINISTIC
BEGIN
    return (SELECT count(*) FROM information_schema.tables where table_name = tableName and table_schema=schema() limit 1) > 0;
END

1
这行不通,因为临时表不会出现在 information_schema.tables 中。 - Flying Turtle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接