MySql存储过程中的此Delete语句不起作用

时间:2016-03-24 14:54:17

标签: mysql stored-procedures elmah

我有这个存储过程来存储Elmah表中的错误:

CREATE DEFINER=`b4d7eb33be6399`@`%` PROCEDURE `elmah_LogError`(
    IN ErrorId CHAR(36), 
    IN Application varchar(60), 
    IN Host VARCHAR(30), 
    IN Type VARCHAR(100), 
    IN Source VARCHAR(60), 
    IN Message VARCHAR(500), 
    IN User VARCHAR(50), 
    IN AllXml TEXT, 
    IN StatusCode INT(10), 
    IN TimeUtc DATETIME
)
    MODIFIES SQL DATA
BEGIN

    INSERT INTO `elmah_error` (
        `ErrorId`, 
        `Application`, 
        `Host`, 
        `Type`, 
        `Source`, 
        `Message`, 
        `User`, 
        `AllXml`, 
        `StatusCode`, 
        `TimeUtc`
    ) VALUES (
        ErrorId, 
        Application, 
        Host, 
        Type, 
        Source, 
        Message, 
        User, 
        AllXml, 
        StatusCode, 
        TimeUtc
    );

DELETE FROM `elmah_error` WHERE ErrorId NOT IN ( 
  SELECT ErrorId 
  FROM ( 
    SELECT ErrorId 
    FROM `elmah_error`
    ORDER BY TimeUtc DESC 
    LIMIT 100
  ) x 
);

END

我添加了DELETE部分,仅保留100条最后记录。问题是它什么也没做。但是,如果我单独使用此DELETE代码并在MySql Workbench内的查询窗口中运行它,它会在我想要保留的100之后正确删除记录。奇怪没有?

2 个答案:

答案 0 :(得分:0)

在列名上添加反引号:

DELETE FROM `elmah_error` WHERE `ErrorId` NOT IN ( 
  SELECT `ErrorId`
  FROM ( 
    SELECT `ErrorId` 
    FROM `elmah_error`
    ORDER BY `TimeUtc` DESC 
    LIMIT 100
  ) x 
);

除此之外,它们在程序体内被作为变量(因为名称相同)而被威胁。

答案 1 :(得分:0)

我有一个类似的问题,我试图删除超过x天的记录(就像那里的每个例子)。问题是TimeUtc也是一个参数,因此我需要引用该表:WHERE elmah_errorTimeUtc< (现在() - 间隔3个月);

与ErrorId可能存在相同的问题。