2015-10-28 49 views
0

我有一段SQL代碼從ELMAH存儲過程中的SQL Server下采取:如何在mysql中編寫這個特定的查詢?

DELETE FROM [ELMAH_Error] 
WHERE ErrorId NOT IN (SELECT TOP 100 ErrorId FROM ELMAH_Error ORDER BY TimeUtc DESC) 

我現在遷移網站到MySQL改用了,我不知道如何翻譯這個代碼。

我必須這段代碼之後添加翻譯:

CREATE DEFINER=`b43638b86659eb`@`%` 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 
    ); 
END 

我嘗試添加@剛剛結束的聲明,但SQL工作臺(通過ALTER PROCEDURE命令)之前生病的迴應並不這麼看。

感謝

回答

1

等效的SQL服務器TOP關鍵字在MySQL的是Limit,它應該是在查詢

DELETE FROM `ELMAH_Error` 
WHERE ErrorId NOT IN (SELECT ErrorId 
         FROM `ELMAH_Error` 
         ORDER BY TimeUtc DESC LIMIT 100) 
+0

這是接近正確,但你應該使用反引號,而不是括號('[...]' )圍繞表名稱。 –

+0

@EdCottrell - 是的錯過了:) –

+0

謝謝@Sick。我更新了我的問題,向您展示了我嘗試解決方案時遇到的困難。 –

0

的MySQL端不支持limit在某些子查詢。如果這裏的話,那麼使用顯式連接:

DELETE e 
    FROM ELMAH_Error e LEFT JOIN 
     (SELECT ErrorId 
      FROM ELMAH_Error 
      ORDER BY TimeUtc DESC 
      LIMIT 100 
     ) ee 
     ON ee.ErrorId = e.ErrorId 
    WHERE ee.ErrorId IS NULL; 

編輯:

上面的代碼假定ErrorId在表中唯一的,沒有NULL值。如果不是這樣,那麼查詢將不起作用。 (注:假設一個名爲ID列是唯一的,而不是空似乎是一個非常合理的。)

DELETE e 
    FROM ELMAH_Error e LEFT JOIN 
     (SELECT TimeUtc 
      FROM ELMAH_Error 
      ORDER BY TimeUtc DESC 
      LIMIT 100 
     ) ee 
     ON ee.TimeUtc = e.TimeUtc 
    WHERE ee.TimeUtc IS NULL; 
+0

這段代碼被MySql服務器接受。我檢查了生成一個錯誤沒有被破壞。不是。關於刪除記錄,我將能夠在錯誤疊加時檢查它是否工作。我將在此期間將您的解決方案標記爲答案。 –

+0

看來畢竟有問題。這段代碼只在我的錯誤表中保留一個單獨的條目!任何想法? –

+0

@NicolasCadilhac。 。 。當最近的100行都具有相同的'ErrorId'時會發生。 –

0

如果表是非常大的,然後截斷通常遠遠快於刪除在MySQL。喜歡的東西:

lock tables ELMAH_Error write; 
create temporary table cpy_ELMAH_Error 
    select * from ELMAH_Error order by TimeUtc DESC LIMIT 100; 
truncate table ELMAH_Error; 
insert into ELMAH_Error select * from cpy_ELMAH_Error; 
drop table cpy_ELMAH_Error; 
unlock tables; 
+0

謝謝。現在它不是很大,它會增長直到達到100條記錄。之後,DELETE將確保不超過100. –

0

還有一個,如果你有興趣有些簡單的方法:

set @N=0; 
delete from ELMAH_Error where (@N:[email protected]+1) > 101 order by TimeUtc DESC; 
+0

我仍在尋找解決方案。我試過你,它什麼都不刪。任何想法? –