从MySql中的存储过程返回已删除的行

时间:2013-12-05 09:00:49

标签: mysql sql stored-procedures

我有一个必须由MySql(v5.1.72)存储过程执行的任务。 该任务包括几个步骤:

  1. 按某种情况从一个表中选择行集
  2. 删除包含在步骤1中的rowset中的所有行(实际上,按步骤1中的条件删除行)
  3. 从步骤1中检索的过程行返回(在步骤2中删除)
  4. 此程序还有一些额外的限制:

    1. 预计会被频繁调用,因此在请求中创建临时表可能存在问题。
    2. 在程序返回结果并完成工作后,必须删除分配给过程调用的所有数据。因此,如果结果数据存储在表中,则必须在过程调用后自动删除该表。
    3. 没有额外的表可以解决这个问题吗? 如果没有,如何以最好的方式做到这一点?

1 个答案:

答案 0 :(得分:0)

我会创建一个具有额外列名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的行。

你有没有考虑过这样的事?