在 mysql 中创建临时 table 时出现问题
Problems creating a temporary table in mysql
我想在 Mysql 中创建一个存储过程,用于删除某个临时 table(如果它存在),然后在数据库 'prs1' 中创建这个临时 table ].
我创建的程序是这样的:
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 语句,它告诉我 table 不存在:
当我从我的项目(在 Xojo 中创建)执行存储过程时,我没有收到任何错误,但我不知道如何检查它是否完美创建,因为从 Navicat、Valentina Studio 等程序. 当我检查数据库时, table 不存在。
问题是,如何保持 table 打开、插入值和检索查询?我自己解释一下,我的应用程序一直永久打开到数据库的连接,直到我关闭该应用程序。在我的方法中,我启动事务,执行创建临时 table 的语句(感谢存储过程)并完成事务。我没有关闭与数据库的连接,但我不知道如何维护 table.
请问我该如何解决?
非常感谢。
塞尔吉奥
临时 table 仅在创建它们的会话中可用。一旦连接终止,临时 table 就会被删除。
使用临时 table 的一个常见用例是测试框架,您可以在其中使用临时 table 以避免进一步清理。
第 1 节课:
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 节:
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
因此,如果您需要检查临时 table 的完整性或内容,您需要在同一连接中执行此操作,或者您使用的是非临时 tables。
在所有写信给我的人的帮助下,我终于找到了解决方案。我在 Xojo 中编程,所以对数据库的查询是从这个程序中进行的。在 Georg 的帮助下,我意识到临时 table 仅存在于该会话中,如果您关闭它,临时 table 将被删除。这就是我解决问题的方法。
我通过以下步骤创建了一个方法:
// 开始交易
DB.SQLExecute("START TRANSACTION")
// 删除临时 table 如果它存在,如果不存在我们创建它。
我们必须使用这两句SQL:
'DROP temporary table if exists @TemporalTable'
'CREATE temporary table if NOT exists @TablaTemporal(field1 VarChar(13))
// 可选:检查创建时间 table 是否存在(见下文)
// 将值插入临时 table
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
//恢复对时间的协商结果table
Dim stmSQL As String = "SELECT * FROM @Template"
Return DB.SQLSelect( stmSQL )
//删除临时的table
DROP temporary table if exists 'Temporary Table
// 完成交易
DB.CommitTransaction
为了检查和验证临时 table 是否存在,我在 MySQL 数据库中创建了一个包含以下代码的“存储过程”:
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我们只需要用这个代码调用程序:
Dim stmSQL As String = "CALL check_table_exists('@TableTemporal')""
ExecuteSQL(stmSQL) database
并执行此 SQL 查询:
Dim stmSQL As String = "SELECT @table_exists"
Return DB.SQLSelect(stmSQL)
如果结果为'1',则table已经创建并存在;如果它是“0”,则 table 不存在。
我希望这可以帮助某人...在我的情况下,它是纯粹的 self-learning。
一声问候,
塞尔吉奥
我想在 Mysql 中创建一个存储过程,用于删除某个临时 table(如果它存在),然后在数据库 'prs1' 中创建这个临时 table ].
我创建的程序是这样的:
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 语句,它告诉我 table 不存在:
当我从我的项目(在 Xojo 中创建)执行存储过程时,我没有收到任何错误,但我不知道如何检查它是否完美创建,因为从 Navicat、Valentina Studio 等程序. 当我检查数据库时, table 不存在。 问题是,如何保持 table 打开、插入值和检索查询?我自己解释一下,我的应用程序一直永久打开到数据库的连接,直到我关闭该应用程序。在我的方法中,我启动事务,执行创建临时 table 的语句(感谢存储过程)并完成事务。我没有关闭与数据库的连接,但我不知道如何维护 table.
请问我该如何解决?
非常感谢。 塞尔吉奥
临时 table 仅在创建它们的会话中可用。一旦连接终止,临时 table 就会被删除。
使用临时 table 的一个常见用例是测试框架,您可以在其中使用临时 table 以避免进一步清理。
第 1 节课:
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 节:
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
因此,如果您需要检查临时 table 的完整性或内容,您需要在同一连接中执行此操作,或者您使用的是非临时 tables。
在所有写信给我的人的帮助下,我终于找到了解决方案。我在 Xojo 中编程,所以对数据库的查询是从这个程序中进行的。在 Georg 的帮助下,我意识到临时 table 仅存在于该会话中,如果您关闭它,临时 table 将被删除。这就是我解决问题的方法。
我通过以下步骤创建了一个方法:
// 开始交易
DB.SQLExecute("START TRANSACTION")
// 删除临时 table 如果它存在,如果不存在我们创建它。
我们必须使用这两句SQL:
'DROP temporary table if exists @TemporalTable'
'CREATE temporary table if NOT exists @TablaTemporal(field1 VarChar(13))
// 可选:检查创建时间 table 是否存在(见下文)
// 将值插入临时 table
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
//恢复对时间的协商结果table
Dim stmSQL As String = "SELECT * FROM @Template"
Return DB.SQLSelect( stmSQL )
//删除临时的table
DROP temporary table if exists 'Temporary Table
// 完成交易
DB.CommitTransaction
为了检查和验证临时 table 是否存在,我在 MySQL 数据库中创建了一个包含以下代码的“存储过程”:
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我们只需要用这个代码调用程序:
Dim stmSQL As String = "CALL check_table_exists('@TableTemporal')""
ExecuteSQL(stmSQL) database
并执行此 SQL 查询:
Dim stmSQL As String = "SELECT @table_exists"
Return DB.SQLSelect(stmSQL)
如果结果为'1',则table已经创建并存在;如果它是“0”,则 table 不存在。
我希望这可以帮助某人...在我的情况下,它是纯粹的 self-learning。
一声问候, 塞尔吉奥