我有一个必须由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_GuidSELECTINSERTDELETE

当您以后要删除行时。您只需执行

DELETE FROM test_table WHERE Guid=v_Guid;


以这种方式,即使过程运行并且彼此重叠,SP仍可以使用相同的表。您永远不会DROP该表,只需删除具有相关GUID的行。

你考虑过这样的东西吗?

09-25 22:25
查看更多