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