我有一个必须由MySql(v5.1.72)存储过程执行的任务。
该任务包括几个步骤:
根据某种条件从一个表中选择行集
删除步骤1中包含在行集中的所有行(实际上,根据条件从步骤1中删除行)
从在步骤1检索的过程行返回(已在步骤2删除)
而且此过程还有一些其他限制:
预计它会被频繁调用,因此在请求中创建临时表可能会出现问题。
在过程返回结果并完成工作之后,必须删除分配给过程调用的所有数据。因此,如果结果数据存储在表中,则在过程调用后必须自动删除该表。
没有附加表是否可以解决此问题?
如果没有,如何才能做到最好?
最佳答案
我将创建一个表,该表具有一个额外的列名称Guid,类型为CHAR(38)。
这样的事情。
CREATE TABLE `test_table` (
`TestId` int(11) NOT NULL,
`Value` varchar(45) DEFAULT NULL,
`Value1` varchar(45) DEFAULT NULL,
`Guid` char(38) NOT NULL,
PRIMARY KEY (`TestId`),
KEY `Guid` (`Guid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
索引
KEY Guid (Guid)
将帮助SP更快地处理数据。如果您在程序中定义一个golbal变量
DECLARE v_Guid CHAR(38);
然后您可以像这样设置值
SET v_Guid = SELECT UUID();
这将返回类似
18d2e4ea-5d8c-11e3-b923-00ff90aef4a9
的字符串。现在,您可以对执行的每个操作使用此值
v_Guid
。 SELECT
,INSERT
或DELETE
。当您以后要删除行时。您只需执行
DELETE FROM test_table WHERE Guid=v_Guid;
以这种方式,即使过程运行并且彼此重叠,SP仍可以使用相同的表。您永远不会
DROP
该表,只需删除具有相关GUID
的行。你考虑过这样的东西吗?