首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在mysql中创建临时表时遇到的问题

问在mysql中创建临时表时遇到的问题
EN

Stack Overflow用户
提问于 2020-09-04 17:01:59
回答 2查看 1.7K关注 0票数 1

我希望在Mysql中创建一个存储过程,它删除某个临时表(如果存在),然后在数据库‘prs1 1’中创建这个临时表。

我创建的过程是:

代码语言:javascript
复制
    CREATE PROCEDURE `CrearTablaTemporal`(table_name VARCHAR(100))
BEGIN
    SET @TablaTemporal = table_name;
    SET @sql_query1 = CONCAT('DROP temporary table if exists ',@TablaTemporal);
    PREPARE stmt1 FROM @sql_query1;
    EXECUTE stmt1;
    DEALLOCATE PREPARE stmt1;
    
    SET @sql_query2 = CONCAT('CREATE TEMPORARY TABLE IF NOT EXISTS prs1.',@TablaTemporal,' (ean13 VarChar(13)) Engine=MyISAM');
    PREPARE stmt2 FROM @sql_query2;
    EXECUTE stmt2;
    DEALLOCATE PREPARE stmt2;
END

当我执行存储过程时,不会出现错误,但是如果我执行以下SQL语句,它会告诉我表不存在:

当我从我的项目(用Xojo创建)执行存储过程时,我没有任何错误,但我不知道如何检查它是否完美地创建,因为当我检查数据库时,该表并不存在,因为它是从Navicat、Valentina Studio等程序创建的。问题是,如何打开表、插入值和检索查询?我自己解释说,我的应用程序一直打开到数据库的连接,直到我关闭应用程序为止。在我的方法中,我启动事务,执行创建临时表的语句(感谢存储过程)并完成事务。我不关闭到数据库的连接,但是我不知道如何维护表。

请问我怎么解决这个问题?

非常感谢。塞尔吉奥

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-08 11:17:23

最后,在所有写信给我的人的帮助下,我有了解决办法。我用Xojo编程,所以对数据库的查询是从这个程序中进行的。在Georg的帮助下,我意识到临时表只存在于该会话中,如果关闭它,则临时表将被删除。我就是这样解决问题的。

我使用以下步骤创建了一个方法:

//启动事务

代码语言:javascript
复制
DB.SQLExecute("START TRANSACTION")

//如果临时表存在,则删除它,如果没有,则创建它.

我们必须使用以下两个SQL语句:

代码语言:javascript
复制
'DROP temporary table if exists @TemporalTable'
'CREATE temporary table if NOT exists @TablaTemporal(field1 VarChar(13))

//可选:检查创建的时间表是否存在(见下文)

//将值插入临时表中

代码语言:javascript
复制
Dim stmSQL As String 
DB.SQLExecute("START TRANSACTION")

stmSQL = "INSERT INTO @TablaTemporal(field1)"
stmSQL = stmSQL + " VALUES(?)"

Dim ps As MySQLPreparedStatement = DB.Prepare(stmSQL)
If BBDD.Error = True Then MsgBox DB.ErrorMessage
ps.BindType( 0, MySQLPreparedStatement.MYSQL_TYPE_STRING)
ps.Bind( 0, field1)
ps.SQLExecute

DB.Commit
Return Not DB.Error

//根据时间表恢复协商结果

代码语言:javascript
复制
Dim stmSQL As String = "SELECT * FROM @Template"
Return DB.SQLSelect( stmSQL )

//删除临时表

代码语言:javascript
复制
DROP temporary table if exists 'Temporary Table

//完成事务

代码语言:javascript
复制
DB.CommitTransaction

为了检查和验证临时表是否存在,我在包含以下代码的MySQL数据库中创建了一个“存储过程”:

代码语言:javascript
复制
CREATE PROCEDURE check_table_exists(table_name VARCHAR(100))
BEGIN
DECLARE CONTINUE HANDLER FOR SQLSTATE '42S02' SET @err = 1;
SET @err = 0;
SET @table_name = table_name;
SET @sql_query = CONCAT('SELECT 1 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

然后,在Xojo中,我们只需用以下代码调用该过程:

代码语言:javascript
复制
Dim stmSQL As String = "CALL check_table_exists('@TableTemporal')""
ExecuteSQL(stmSQL) database

并执行此SQL查询:

代码语言:javascript
复制
Dim stmSQL As String = "SELECT @table_exists"
Return DB.SQLSelect(stmSQL)

如果结果是'1',表已经创建并存在;如果它是'0',则表不存在。

我希望这能帮到某人..。就我而言,这纯粹是为了自我学习。

问候,塞尔吉奥

票数 1
EN

Stack Overflow用户

发布于 2020-09-05 14:57:23

临时表仅在创建临时表的会话中可用。一旦连接被终止,临时表就会被删除。

使用临时表的一个常见用法是测试框架,您可以使用临时表来避免进一步的清理。

第1场会议:

代码语言:javascript
复制
mysql> delimiter !!
mysql> CREATE PROCEDURE CreateTable(table_name VARCHAR(100))
    -> BEGIN
    ->   SET @a:= CONCAT("CREATE OR REPLACE TEMPORARY TABLE ", table_name, " (a int)");
    ->   EXECUTE IMMEDIATE @a;
    -> END!!
Query OK, 0 rows affected (0,01 sec)

mysql> delimiter ;
mysql> select connection_id();
+-----------------+
| connection_id() |
+-----------------+
|            4118 |
+-----------------+
1 row in set (0,00 sec)

mysql> describe foobar;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| a     | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0,00 sec)

第2场会议:

代码语言:javascript
复制
mysql> select connection_id();
+-----------------+
| connection_id() |
+-----------------+
|            4119 |
+-----------------+
1 row in set (0,01 sec)

mysql> describe foobar;
ERROR 1146 (42S02): Table 'test.foobar' doesn't exist

因此,如果您需要检查临时表的完整性或内容,则需要在同一连接内进行检查,或者使用非临时表。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63745303

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档