![]() |
Datenbank: MySQL • Version: 5.1.x • Zugriff über: UniDac (devart)
MySQL Delete mit Offset
Tag auch.
Ich habe ein Problem mit einer Delete Anweisung: Ich möchte eine bestimmte Anzahl der neuesten Datensätze behalten sprich einen Delete-Offset (z.B. 500 pro Customer) Nun unterstützen weder DELETE noch Subqueries den LIMIT Befehl, das heißt also, 2 Queries:
Delphi-Quellcode:
(Ist ne Quick & Dirty Testanweisung, also wenig Sicherheit und keine Parameter.)
procedure TForm_DBCleanUp.CleanUpAlmTblClick(Sender: TObject);
var i : Integer; strMaximum : String; strMinimum : String; strIdCstm : String; strSQL1 : String; strSQL2 : String; begin strMaximum := Edt_AlmTbl.Text; for i := 0 to (NumberOfCustomers -1) do begin strIdCstm := IntToStr(arrCommunication[i]); strSQL1 := Format('SELECT MIN(id) AS MINIMUM FROM cstm_alarms WHERE id_cstm = %s' + ' ORDER BY id DESC LIMIT %s', [strIdCstm, strMaximum]); OpenQuery(strSQL1); strMinimum := DataModule.Query_DBCleanUp.FieldByName('MINIMUM').AsString; strSQL2 := Format('DELETE FROM cstm_alarms WHERE id_cstm = %s AND id < %s', [strIdCstm, strMinimum]); ExecuteQuery(strSQL2); end; end; Nun die eigentliche Frage: Das LIMIT im ersten Query hat anscheinend keinen Einfluss auf Aggregatsfunktionen, da MIN mir unabhängig vom LIMIT den gleichen Wert zurückgibt, nämlich das absloute Minimum des jeweiligen Customers. Es werden also nie Datensätze entfernt. Gibt es in Kombination mit MIN eine Möglichkeit ordentliche Werte zu bekommen, oder muss ich das Pferd anders aufsatteln. Danke schonmal. PS: Ohne MIN Benutzung funktioniert es. Ist aber nicht die feine englische Art.
Delphi-Quellcode:
strSQL1 :=
Format('SELECT id FROM cstm_alarms WHERE id_cstm = %s' + ' ORDER BY id DESC LIMIT %s', [strIdCstm, strMaximum]); OpenQuery(strSQL1); DataModule.Query_DBCleanUp.Last; strMinimum := DataModule.Query_DBCleanUp.FieldByName('id').AsString; |
AW: MySQL Delete mit Offset
Zitat:
![]() |
AW: MySQL Delete mit Offset
Hab mich falsch ausgedrückt:
Ich meinte dass der Offset-Teil von Limit beim Delete nicht funktioniert. |
AW: MySQL Delete mit Offset
Ginge das nicht auch prinzipiell so?
SQL-Code:
DELETE FROM Tabelle
WHERE ID NOT IN ( SELECT ID FROM Tabelle ORDER BY ID DESC LIMIT 500) |
AW: MySQL Delete mit Offset
Zitat:
|
AW: MySQL Delete mit Offset
Dann eben wie gehabt mit 2 Abfragen, aber ohne MIN (das ist an dieser Stelle eh sinnlos IMO).
|
AW: MySQL Delete mit Offset
Ich dachte nur, dass die MIN Benutzung das Ganze etwas beschleunigt, da ich nun die Liste der IDs öffne, nur um dann den Wert des letzten Datensatzes auszulesen.
Wenn eine Änderung hier allerdings keine Performace-Vorteile bringt, kann ich es auch so lassen. Danke schön. |
AW: MySQL Delete mit Offset
Wie Du selbst sagst, berücksichtig das MIN ja nicht die Limitierung, also muss man es weglassen.
[OT] Und für diesen Mist soll man bezahlen? Dann darf man ja gespannt sein, ob Oracle wenigstens so elementare Dinge mit einbaut. [/OT] |
AW: MySQL Delete mit Offset
Zum OT:
Hast schon Recht. Dass Subqueries und Aggregatfunktionen kein LIMIT sprechen und DELETE kein Offset ist ein echter Mist. Schauen wir mal, ob sich da was tut. (Allerdings hab ich bei Oracle wenig Hoffnung) Btw: Einen Feature Request für Offset im Delete gibt es seit dem 7 Nov 2005 ... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:25 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz