MySQL ROW-NUMBER auf bestimmte Zeile zugreifen
Hallo,
ich habe eine Tabelle die ich mit ROW_NUMBER auswerten möchte.
Also ich lasse folgenden Befehl laufen.
Das klappt auch gut.
Wie kann ich denn nun dieses benutzen um damit zu arbeiten. Also zum Beispiel wenn ich auf Zeile 1 auf Löschen klicke dann Zeile 1 auch gelöscht wird usw.
Da hänge ich gerade richtig und glaube dass ich hier ein Verständnisproblem habe. Es muss doch möglich sein dann weiter mit diesen Zeilennummern zu arbeiten. Ich habe gesucht, leider ohne Erfolg.
Danke
Grüße
MarFra
ich habe eine Tabelle die ich mit ROW_NUMBER auswerten möchte.
Also ich lasse folgenden Befehl laufen.
SELECT *, ROW_NUMBER() OVER(ORDER BY id) as RN FROM termine;
Das klappt auch gut.
Wie kann ich denn nun dieses benutzen um damit zu arbeiten. Also zum Beispiel wenn ich auf Zeile 1 auf Löschen klicke dann Zeile 1 auch gelöscht wird usw.
Da hänge ich gerade richtig und glaube dass ich hier ein Verständnisproblem habe. Es muss doch möglich sein dann weiter mit diesen Zeilennummern zu arbeiten. Ich habe gesucht, leider ohne Erfolg.
Danke
Grüße
MarFra
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 5455797662
Url: https://administrator.de/contentid/5455797662
Ausgedruckt am: 19.11.2024 um 07:11 Uhr
5 Kommentare
Neuester Kommentar
Nein das ist in SQL nicht möglich. Du kannst ROW_NUMBER() auch nicht in der WHERE-Kausel des selben Statements nutzen da es erst zur Laufzeit überhaupt existiert / Werte enthält. Diese Werte stehen aber nicht in der eigentlichen Datenbank-Tabelle, die existieren nur im Ergebnis.
Grundsätzlich hat jeder Datensatz i.d.R. einen Primärschlüssel und den verwendest du um mit deinem Front-End Datensätze zu schreiben.
PS: Natürlich kann man mit Subquerys die ROW_NUMBER() auch als Update-Kriterium nutzen aber das wäre ganz großer Schmu. Die ROW_NUMBER() ist variabel und nicht eindeutig! Zwischen Datenabruf und Update-Befehl kann sich der Inhalt der Tabelle ändern.
Grundsätzlich hat jeder Datensatz i.d.R. einen Primärschlüssel und den verwendest du um mit deinem Front-End Datensätze zu schreiben.
PS: Natürlich kann man mit Subquerys die ROW_NUMBER() auch als Update-Kriterium nutzen aber das wäre ganz großer Schmu. Die ROW_NUMBER() ist variabel und nicht eindeutig! Zwischen Datenabruf und Update-Befehl kann sich der Inhalt der Tabelle ändern.
Ja deine Denkweise ist falsch, sry wenn das jetzt harsch klingt. Erstmal ein paar Grundprinzipien:
- Eine Tabelle hat nie eine eigene Ordnung in irgend einer Form. Sortierung ist immer eine Eigenschaft bei der Ausgabe die in der Abfrage dann spezifisch gesetzt wird aber es gibt keine Default-Reihenfolge.
- Eine Tabelle hat auch keine eigene Datensatz ID (okay stimmt nicht immer zu 100% aber die ist für dich eigentlich nicht nutzbar), die wird in der Tabellen Definition von dir erst als Primary Key deklariert. Das DBMS sorgt dann dafür das die ID eindeutig sein muss, ansonsten kommt kein Datensatz rein.
- Format und Inhalt der ID sind völlig egal. Du kannst eine Zahl hoch zählen oder einfach zufällig wählen, eine Zeichenkette nutzen oder mehrere Spalten kombinieren. Das Ergebnis muss nur eindeutig sein.
- Zur ID gibt es immer einen Index und der sorgt für die Geschwindigkeit beim Wiederauffinden von Daten anhand der ID. Indexe haben eine eigene Sortierung!
Daraus ergibt sich das es ziemlich blödsinnig ist eine ID überhaupt zu ändern, das macht man eigentlich nicht. Würde man das tun müsste man auch jedes Mal den Index anpassen und zwar für alle Datensätze. Ganz zu schweigen von Fremdschlüsseln die auf deine ID zeigen, alles anpassen, alles in einer Aktion. Theoretisch können auch noch exportierte oder replizierte Daten einen Bezug zu deinen Daten haben, der geht in dem Moment verloren. Daraus ergibt sich dann auch das eine ID nicht der Sortierung dient sondern nur der Identifizierung.
Du kannst dir eine Spalte Zeilennummer basteln (eventuell auch als berechnete Spalte aber wir reden hier über MySQL) oder du kannst dir mit ROW_NUMBER() im Ergebnis eine Zeilennummer anzeigen lassen. Willst du aber den Datensatz bearbeiten dann ist diese Zeilennummer nichts wert weil in dem Moment wo die Abfrage durch gelaufen ist kann sie sich durch eine andere Aktion in der Datenbank (also z.B. ein anderer Benutzer) ändern weil ja jeder Datensätze einfügen, ändern oder löschen kann. Die Tabelle ist nicht gesperrt und deine Zeilennummer ist nur für dein Ergebnis zwingend gültig.
- Eine Tabelle hat nie eine eigene Ordnung in irgend einer Form. Sortierung ist immer eine Eigenschaft bei der Ausgabe die in der Abfrage dann spezifisch gesetzt wird aber es gibt keine Default-Reihenfolge.
- Eine Tabelle hat auch keine eigene Datensatz ID (okay stimmt nicht immer zu 100% aber die ist für dich eigentlich nicht nutzbar), die wird in der Tabellen Definition von dir erst als Primary Key deklariert. Das DBMS sorgt dann dafür das die ID eindeutig sein muss, ansonsten kommt kein Datensatz rein.
- Format und Inhalt der ID sind völlig egal. Du kannst eine Zahl hoch zählen oder einfach zufällig wählen, eine Zeichenkette nutzen oder mehrere Spalten kombinieren. Das Ergebnis muss nur eindeutig sein.
- Zur ID gibt es immer einen Index und der sorgt für die Geschwindigkeit beim Wiederauffinden von Daten anhand der ID. Indexe haben eine eigene Sortierung!
Daraus ergibt sich das es ziemlich blödsinnig ist eine ID überhaupt zu ändern, das macht man eigentlich nicht. Würde man das tun müsste man auch jedes Mal den Index anpassen und zwar für alle Datensätze. Ganz zu schweigen von Fremdschlüsseln die auf deine ID zeigen, alles anpassen, alles in einer Aktion. Theoretisch können auch noch exportierte oder replizierte Daten einen Bezug zu deinen Daten haben, der geht in dem Moment verloren. Daraus ergibt sich dann auch das eine ID nicht der Sortierung dient sondern nur der Identifizierung.
Du kannst dir eine Spalte Zeilennummer basteln (eventuell auch als berechnete Spalte aber wir reden hier über MySQL) oder du kannst dir mit ROW_NUMBER() im Ergebnis eine Zeilennummer anzeigen lassen. Willst du aber den Datensatz bearbeiten dann ist diese Zeilennummer nichts wert weil in dem Moment wo die Abfrage durch gelaufen ist kann sie sich durch eine andere Aktion in der Datenbank (also z.B. ein anderer Benutzer) ändern weil ja jeder Datensätze einfügen, ändern oder löschen kann. Die Tabelle ist nicht gesperrt und deine Zeilennummer ist nur für dein Ergebnis zwingend gültig.