【问题标题】:How to understand a mysql temporary table already exists in a stored procedure?如何理解存储过程中已经存在的mysql临时表?
【发布时间】:2014-02-09 18:32:52
【问题描述】:

我使用mysql临时表在几个存储过程之间共享一些中间数据。所有这些过程都使用单个数据库连接。 在每个 SP 中,我需要确定一个 mysql 临时表是否已经存在。如果它已经存在,那么我将使用它的值,否则 SP 将创建并填充临时表和其他 SP(当然在同一连接上!)将使用临时表结果。

但是我不知道我应该如何检查临时表是否已经存在,我的意思是这样的:

IF temporaryTablename EXISTS THEN
   ...
ELSE
   ...
END IF;

有什么想法吗?

【问题讨论】:

  • 我很想在表上尝试 DESCRIBE 并检查返回的 sqlcode(认为可以在存储过程中完成)。不确定是否创建/如果不存在,是否根据是否创建表获得不同的 sqlcode。

标签: mysql stored-procedures exists temp-tables


【解决方案1】:

创建表时有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 demo

更新

...
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;
...

【讨论】:

  • 这不是我回答的问题,我只想在表已经不存在的情况下插入值,但在这里你不提供任何检查它的方法
  • @EhsanKhodarahmi:我绝对不明白你的问题。我希望更新可以提供帮助。
【解决方案2】:

由于某种原因 wchiquito 的 UPDATE 对我不起作用,所以我将其修改为:

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。

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

【讨论】:

    【解决方案3】:

    我用这个:

    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
    

    【讨论】:

    • 这不起作用,因为临时表没有出现在 information_schema.tables 中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-13
    • 1970-01-01
    • 2011-07-15
    • 1970-01-01
    • 2012-11-19
    • 2014-12-22
    相关资源
    最近更新 更多