在MySQL中创build表variables

我需要一个表variables在MySQL过程中存储表中的特定行。 例如declare @tb table(id int,name varchar(200))

这可能吗? 如果是的话如何?

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

CREATE PROCEDURE my_proc () BEGIN CREATE TEMPORARY TABLE TempTable (myid int, myfield varchar(100)); INSERT INTO TmpTable SELECT tblid, tblfield FROM Table1; /* Do some more stuff .... */ 

从MySQL这里

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

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

 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; 

来自forge.mysql.com 。 另请参阅本文的临时表部分。

回答您的问题:不,MySQL不支持SQL Server(http://msdn.microsoft.com/zh-cn/library/ms188927.aspx)提供的相同方式的Table-typedvariables。; Oracle提供了类似的function,但将其称为游标types而不是表types(http://docs.oracle.com/cd/B12037_01/appdev.101/b10807/13_elems012.htm)。;

根据您的需要,您可以使用临时表以类似于Oracle和SQL Server提供的方式在MySQL中模拟表/光标types的variables。

但是,临时表方法和表/游标typesvariables方法之间有一个重要的区别,它有很多性能影响(这就是为什么Oracle和SQL Server提供这个function超过了临时提供的function表)。

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

可能的解决方法:

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

如果你不想在数据库中存储表格,那么@Evan Todd已经提供了临时表格解决scheme。

但是,如果你需要其他用户的表,并希望存储在分贝,那么你可以使用下面的程序。

在“存储过程”下面创build:

————

 DELIMITER $$ USE `test`$$ DROP PROCEDURE IF EXISTS `sp_variable_table`$$ CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_variable_table`() BEGIN SELECT CONCAT('zafar_',REPLACE(TIME(NOW()),':','_')) INTO @tbl; SET @str=CONCAT(“create table “,@tbl,” (pbirfnum BIGINT(20) NOT NULL DEFAULT '0′, paymentModes TEXT ,paymentmodeDetails TEXT ,shippingCharges TEXT ,shippingDetails TEXT ,hypenedSkuCodes TEXT ,skuCodes TEXT ,itemDetails TEXT ,colorDesc TEXT ,size TEXT ,atmDesc TEXT ,promotional TEXT ,productSeqNumber VARCHAR(16) DEFAULT NULL,entity TEXT ,entityDetails TEXT ,kmtnmt TEXT ,rating BIGINT(1) DEFAULT NULL,discount DECIMAL(15,0) DEFAULT NULL,itemStockDetails VARCHAR(38) NOT NULL DEFAULT ”) ENGINE=INNODB DEFAULT CHARSET=utf8″); PREPARE stmt FROM @str; EXECUTE stmt; DEALLOCATE PREPARE stmt; SELECT 'Table has been created'; END$$ DELIMITER ; 

—————-

现在你可以执行这个过程来创build一个variables名称表,

调用sp_variable_table();

你可以在执行下面的命令之后检查新表,

使用testing;显示表格如'%zafar%'; – testing是在这里“数据库”的名称。

您还可以在下面的path中查看更多详细信息 –

http://mydbsolutions.in/how-can-create-a-table-with-variable-name/

不是问题的解决scheme,而是另一个简单的select。 如果表是您想要的单列表,则通过连接值并在SP内提取string参数。

其实你可以使用mysql表variables。 这里是官方文档http://dev.mysql.com/doc/refman/5.5/en/sql-syntax-prepared-statements.html的一个例子;

 mysql> USE test; mysql> CREATE TABLE t1 (a INT NOT NULL); mysql> INSERT INTO t1 VALUES (4), (8), (11), (32), (80); mysql> SET @table = 't1'; mysql> SET @s = CONCAT('SELECT * FROM ', @table); mysql> PREPARE stmt3 FROM @s; mysql> EXECUTE stmt3;