DELETE und SELECT kombinieren?
DELETE und SELECT kombinieren?
am 12.02.2007 13:36:18 von thorny
Hallo,
ich sitze gerade vor einem "leicht klingenden" Problem:
Ich möchte aus einer Tabelle alle Einträge löschen, die vor den letzten
X Einträgen liegen. Liegt das Limit bei 150 und existieren 200 Einträge
in der DB, möchte ich die _ersten_ 50 löschen.
Zu erst wollte ich das mit einem Limit lösen:
DELETE FROM table ORDER BY receive_time ASC LIMIT 150, $ANZAHL_ROWS
Nun sagt das Handbuch allerdings, dass Limit nur die Anzahl der zu
löschenden Datensätze akzeptiert.
Wie stelle ich das jetzt am besten an (ohne Stored Procedure). Kann ich
die betreffenden Datensätze per SELECT auswählen und an DELETE
übergeben, ohne etwas anderes als die DB zu verwenden?
Es ist im übrigen eine MySQL 5.0.21.
Danke für eure Hilfe,
Torsten
Re: DELETE und SELECT kombinieren?
am 12.02.2007 13:50:27 von Andreas Kretschmer
Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Deutsche PostgreSQL User Group: http://pgug.de
Re: DELETE und SELECT kombinieren?
am 12.02.2007 13:51:39 von Christian Kirsch
Am 12.02.2007 13:36 schrieb Torsten Zuehlsdorff:
> Hallo,
>
> ich sitze gerade vor einem "leicht klingenden" Problem:
>
> Ich möchte aus einer Tabelle alle Einträge löschen, die vor den letzten
> X Einträgen liegen. Liegt das Limit bei 150 und existieren 200 Einträge
> in der DB, möchte ich die _ersten_ 50 löschen.
>
> Zu erst wollte ich das mit einem Limit lösen:
> DELETE FROM table ORDER BY receive_time ASC LIMIT 150, $ANZAHL_ROWS
>
> Nun sagt das Handbuch allerdings, dass Limit nur die Anzahl der zu
> löschenden Datensätze akzeptiert.
>
> Wie stelle ich das jetzt am besten an (ohne Stored Procedure). Kann ich
> die betreffenden Datensätze per SELECT auswählen und an DELETE
> übergeben, ohne etwas anderes als die DB zu verwenden?
>
WHERE IN (SELECT ...) ?
Re: DELETE und SELECT kombinieren?
am 12.02.2007 14:15:33 von thorny
Andreas Kretschmer schrieb:
> begin Torsten Zuehlsdorff schrieb:
>
>>Hallo,
>>
>>ich sitze gerade vor einem "leicht klingenden" Problem:
>>
>>Ich möchte aus einer Tabelle alle Einträge löschen, die vor den letzten
>>X Einträgen liegen. Liegt das Limit bei 150 und existieren 200 Einträge
>>in der DB, möchte ich die _ersten_ 50 löschen.
> [..]
> test=*# delete from t2 where i not in (select i from t2 order by i desc limit 2);
> DELETE 2
> test=*# select * from t2;
Der Ansatz ist gut (danke!), MySQL mag jedoch nicht:
ERROR 1235 (42000): This version of MySQL doesn't yet support 'LIMIT &
IN/ALL/ANY/SOME subquery'
Getestet mit 5.0.21.
Ist jetzt ein Upgrade nötig?
Gruß,
Torsten
Re: DELETE und SELECT kombinieren?
am 12.02.2007 14:16:56 von Andreas Kretschmer
Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Deutsche PostgreSQL User Group: http://pgug.de
Re: DELETE und SELECT kombinieren?
am 12.02.2007 14:19:22 von thorny
Andreas Kretschmer schrieb:
>>Der Ansatz ist gut (danke!), MySQL mag jedoch nicht:
>>ERROR 1235 (42000): This version of MySQL doesn't yet support 'LIMIT &
>>IN/ALL/ANY/SOME subquery'
>>
>>Getestet mit 5.0.21.
>>Ist jetzt ein Upgrade nötig?
>
> Ja, auf PostgreSQL ;-)
Immerhin bist du in deinen Antworten verläßlich. :P
Gibt es in PostGre eigentlich etwas ähnliches wie in MySQL der
Tabellentyp "Federated"?
Gruß,
Torsten
Re: DELETE und SELECT kombinieren?
am 12.02.2007 14:21:36 von Christian Kirsch
Am 12.02.2007 14:19 schrieb Torsten Zuehlsdorff:
> Andreas Kretschmer schrieb:
>
>>> Der Ansatz ist gut (danke!), MySQL mag jedoch nicht:
>>> ERROR 1235 (42000): This version of MySQL doesn't yet support 'LIMIT &
>>> IN/ALL/ANY/SOME subquery'
>>>
>>> Getestet mit 5.0.21.
>>> Ist jetzt ein Upgrade nötig?
>> Ja, auf PostgreSQL ;-)
>
> Immerhin bist du in deinen Antworten verläßlich. :P
>
>
> Gibt es in PostGre eigentlich etwas ähnliches wie in MySQL der
> Tabellentyp "Federated"?
>
Weiß nicht - aber Oracle kennt das als "Database Link" ;-) Und Oracle
sollte auch Deine Subquery da oben verarbeiten (möglicherweise
müsstest Du da ein bisschen mit Row-IDs experimentieren oder so ...)
Re: DELETE und SELECT kombinieren?
am 12.02.2007 14:23:35 von thorny
Christian Kirsch schrieb:
>>>>Der Ansatz ist gut (danke!), MySQL mag jedoch nicht:
>>>>ERROR 1235 (42000): This version of MySQL doesn't yet support 'LIMIT &
>>>>IN/ALL/ANY/SOME subquery'
>>>>
>>>>Getestet mit 5.0.21.
>>>>Ist jetzt ein Upgrade nötig?
>>>
>>>Ja, auf PostgreSQL ;-)
>>
>>Immerhin bist du in deinen Antworten verläßlich. :P
>>
>>
>>Gibt es in PostGre eigentlich etwas ähnliches wie in MySQL der
>>Tabellentyp "Federated"?
>
> Weiß nicht - aber Oracle kennt das als "Database Link" ;-) Und Oracle
> sollte auch Deine Subquery da oben verarbeiten (möglicherweise
> müsstest Du da ein bisschen mit Row-IDs experimentieren oder so ...)
Ein Oracle habe ich gerade nicht zur Verfügung. Ich könnte noch mit
einem Firebird dienen ^^
Gruß,
Torsten
Re: DELETE und SELECT kombinieren?
am 12.02.2007 14:25:59 von Andreas Kretschmer
Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Deutsche PostgreSQL User Group: http://pgug.de
Re: DELETE und SELECT kombinieren?
am 12.02.2007 14:27:39 von Kai Ruhnau
Torsten Zuehlsdorff schrieb:
> ich sitze gerade vor einem "leicht klingenden" Problem:
>
> Ich möchte aus einer Tabelle alle Einträge löschen, die vor den letzten
> X Einträgen liegen. Liegt das Limit bei 150 und existieren 200 Einträge
> in der DB, möchte ich die _ersten_ 50 löschen.
>
> Zu erst wollte ich das mit einem Limit lösen:
> DELETE FROM table ORDER BY receive_time ASC LIMIT 150, $ANZAHL_ROWS
>
> Nun sagt das Handbuch allerdings, dass Limit nur die Anzahl der zu
> löschenden Datensätze akzeptiert.
>
> Wie stelle ich das jetzt am besten an (ohne Stored Procedure). Kann ich
> die betreffenden Datensätze per SELECT auswählen und an DELETE
> übergeben, ohne etwas anderes als die DB zu verwenden?
>
> Es ist im übrigen eine MySQL 5.0.21.
Das einfachste sollte sein, die Primary Keys, die du löschen möchtest in
eine temporäre Tabelle zu SELECTen und dann beim Löschen dagegen zu
JOINen. Dann hast du das DELETE und das SELECT voneinander getrennt, was
ja bekanntermaßen (noch) nicht gemeinsam funktioniert.
Grüße
Kai
Re: DELETE und SELECT kombinieren?
am 12.02.2007 14:52:45 von Robert Klemme
On 12.02.2007 14:21, Christian Kirsch wrote:
> Am 12.02.2007 14:19 schrieb Torsten Zuehlsdorff:
>> Andreas Kretschmer schrieb:
>>
>>>> Der Ansatz ist gut (danke!), MySQL mag jedoch nicht:
>>>> ERROR 1235 (42000): This version of MySQL doesn't yet support 'LIMIT &
>>>> IN/ALL/ANY/SOME subquery'
>>>>
>>>> Getestet mit 5.0.21.
>>>> Ist jetzt ein Upgrade nötig?
>>> Ja, auf PostgreSQL ;-)
>> Immerhin bist du in deinen Antworten verläßlich. :P
>>
>>
>> Gibt es in PostGre eigentlich etwas ähnliches wie in MySQL der
>> Tabellentyp "Federated"?
>>
>
> Weiß nicht - aber Oracle kennt das als "Database Link" ;-) Und Oracle
> sollte auch Deine Subquery da oben verarbeiten (möglicherweise
> müsstest Du da ein bisschen mit Row-IDs experimentieren oder so ...)
Ich rate eher zu ROWNUM, nicht ROWID. ;-)
Ciao
robert