在MySQL中创建表变量

ANI*_*ANE 45 mysql variables database-table

我需要一个表变量来存储MySQL过程中表中的特定行.例如声明@tb表(id int,name varchar(200))

这可能吗?如果有,怎么样?

Pre*_*gha 65

他们在MySQL中不存在吗?只需使用临时表:

CREATE PROCEDURE my_proc () BEGIN 

CREATE TEMPORARY TABLE TempTable (myid int, myfield varchar(100)); 
INSERT INTO TempTable SELECT tblid, tblfield FROM Table1; 

/* Do some more stuff .... */
Run Code Online (Sandbox Code Playgroud)

来自MySQL这里

"创建表时可以使用TEMPORARY关键字.TEMPORARY表只对当前连接可见,并在连接关闭时自动删除.这意味着两个不同的连接可以使用相同的临时表名而不会与每个连接冲突其他或与现有的同名非TEMPORARY表.(在删除临时表之前隐藏现有表.)"

  • 如果多个用户尝试运行相同的过程,它会创建任何并发问题吗? (4认同)
  • 临时表是特定于会话的,而不是特定于用户的 (2认同)
  • 根据您的应用程序使用会话的方式,它可以使用相同的数据库会话进行多线程处理。在这种情况下你不会遇到并发问题吗?即线程 A 开始添加记录,然后线程 B 也开始添加记录,现在表已损坏,因为线程 A 只需要它插入的记录,而不需要线程 B 的 @humility (2认同)

Ewa*_*odd 9

也许临时表会做你想要的.

CREATE TEMPORARY TABLE SalesSummary (
product_name VARCHAR(50) NOT NULL
, total_sales DECIMAL(12,2) NOT NULL DEFAULT 0.00
, avg_unit_price DECIMAL(7,2) NOT NULL DEFAULT 0.00
, total_units_sold INT UNSIGNED NOT NULL DEFAULT 0
) ENGINE=MEMORY;

INSERT INTO SalesSummary
(product_name, total_sales, avg_unit_price, total_units_sold)
SELECT 
  p.name
  , SUM(oi.sales_amount)
  , AVG(oi.unit_price)
  , SUM(oi.quantity_sold)
FROM OrderItems oi
INNER JOIN Products p
    ON oi.product_id = p.product_id
GROUP BY p.name;

/* Just output the table */
SELECT * FROM SalesSummary;

/* OK, get the highest selling product from the table */
SELECT product_name AS "Top Seller"
FROM SalesSummary
ORDER BY total_sales DESC
LIMIT 1;

/* Explicitly destroy the table */
DROP TABLE SalesSummary; 
Run Code Online (Sandbox Code Playgroud)

来自forge.mysql.com.另请参见本文的临时表.


num*_*ari 6

回答你的问题:不,MySQL不支持表类型变量,其方式与SQL Server(http://msdn.microsoft.com/en-us/library/ms188927.aspx)提供的方式相同.Oracle提供了类似的功能,但是将它们称为Cursor类型而不是表类型(http://docs.oracle.com/cd/B12037_01/appdev.101/b10807/13_elems012.htm).

根据您的需要,您可以使用临时表以类似于Oracle和SQL Server提供的方式模拟MySQL中的表/游标类型变量.

但是,临时表方法和表/游标类型变量方法之间存在重要差异,并且它具有很多性能影响(这就是Oracle和SQL Server提供此功能的原因,而不仅仅是临时提供的功能表).

具体来说:表/游标类型变量允许客户端在客户端整理多行数据,并将它们作为存储过程或预准备语句的输入发送到服务器.这消除了发送每个单独行的开销,而是为一批行支付一次开销.当您尝试导入大量数据时,这会对整体性能产生重大影响.

可能的解决方法:

您可能想要尝试创建一个临时表,然后使用LOAD DATA(http://dev.mysql.com/doc/refman/5.1/en/load-data.html)命令将数据流式传输到临时表中表.然后,您可以将临时表的名称传递给存储过程.这仍然会导致对数据库服务器的两次调用,但是如果要移动足够的行,那么可能会节省一些.当然,如果您在更新目标表时在存储过程中执行某种逻辑,这实际上是有益的.如果没有,您可能只想将DATA直接加载到目标表中.


Jus*_*ene 5

MYSQL 8 在某种程度上做到了:

MYSQL 8 支持 JSON 表,因此您可以将结果加载到 JSON 变量中,并使用 JSON_TABLE() 命令从该变量中进行选择。