我有这个存储过程来存储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之后正确删除记录。奇怪没有?
答案 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_error
。TimeUtc
< (现在() - 间隔3个月);
与ErrorId可能存在相同的问题。