MySql存储过程更新数据库记录

时间:2012-10-04 12:45:14

标签: mysql sql stored-procedures

之前我没有写过任何MySql存储过程,所以根本就不知道它们。我有一个数据库表,其中包含一些记录。主列为dateTime - 此记录保存在数据库中。

我编写了MySql存储过程来选择指定日期的每条记录:

CREATE PROCEDURE getMessages(IN dateFrom DATETIME)   
    SELECT * FROM EsbMessage WHERE dateTime <= dateFrom;

这就是电话:

CALL getMessages('2012-10-04 13:11:09');

这样可以正常工作,它会返回指定日期的记录。

我需要做的是:

  1. 如果记录超过一周,我需要更新另一个 列。
  2. 如果记录超过一年,我需要删除该记录。
  3. 我可以通过编程方式轻松完成此操作,但在这种情况下,我必须使用存储过程执行此操作。

    所以我想到这样的事情:

    CREATE PROCEDURE updateMessages(IN dateFrom DATETIME)   
        BEGIN
          SELECT * FROM EsbMessage WHERE dateTime <= dateFrom;
          #for each message
          #if the message is over one week old but not over one year old:
          UPDATE EsbMessage SET body = '';
          #if message is over one year old:
          DELETE FROM EsbMessage WHERE dateTime = #message.dateTime
    END
    

    但我不知道如何在存储过程中使用for循环,以及如何根据我的要求编写if语句,而另一件事我现在不知道如何计算MySql中的日期。对于例如如果我有当前日期,那么我需要从当前日期减去365天。

    有人可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

您不需要循环,只需在WHERE子句中输入条件:

#if the message is over one week old but not over one year old:
UPDATE EsbMessage SET body = ''
WHERE dateTime >= DATE_SUB(NOW(),INTERVAL 1 WEEK) AND dateTime <= DATE_SUB(NOW(),INTERVAL 1 YEAR);

#if message is over one year old:
DELETE FROM EsbMessage WHERE dateTime >= DATE_SUB(NOW(),INTERVAL 1 YEAR);

答案 1 :(得分:0)

如何循环和使用if子句在此处描述:http://www.mysqltutorial.org/stored-procedures-loop.aspx

我会在没有循环的情况下这样做:

CREATE PROCEDURE updateMessages(IN dateFrom DATETIME)   
BEGIN      
  UPDATE EsbMessage SET body = '' where dateTime <= dateFrom -(86400*7); //86400 = 1 day
  #if message is over one year old:
  DELETE FROM EsbMessage where dateTime <= dateFrom -(86400*365);
END