Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   MySQL Delete mit Offset (https://www.delphipraxis.net/156050-mysql-delete-mit-offset.html)

alphaflight83 18. Nov 2010 09:48

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:
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;
(Ist ne Quick & Dirty Testanweisung, also wenig Sicherheit und keine Parameter.)

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;

hhcm 18. Nov 2010 09:58

AW: MySQL Delete mit Offset
 
Zitat:

Zitat von alphaflight83 (Beitrag 1062278)
Nun unterstützen weder DELETE noch Subqueries den LIMIT Befehl, das heißt also, 2 Queries:

Sicher das DELETE kein Limit unterstützt ? Klick

alphaflight83 18. Nov 2010 10:13

AW: MySQL Delete mit Offset
 
Hab mich falsch ausgedrückt:
Ich meinte dass der Offset-Teil von Limit beim Delete nicht funktioniert.

DeddyH 18. Nov 2010 10:14

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)

alphaflight83 18. Nov 2010 10:19

AW: MySQL Delete mit Offset
 
Zitat:

Zitat von DeddyH (Beitrag 1062282)
Ginge das nicht auch prinzipiell so? ...

Leider nicht, da MySQL Subqueries wie gesagt LIMIT (noch) nicht unterstützen

DeddyH 18. Nov 2010 10:23

AW: MySQL Delete mit Offset
 
Dann eben wie gehabt mit 2 Abfragen, aber ohne MIN (das ist an dieser Stelle eh sinnlos IMO).

alphaflight83 18. Nov 2010 10:28

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.

DeddyH 18. Nov 2010 10:35

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]

alphaflight83 18. Nov 2010 10:42

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 23:25 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz