ERLEDIGT
NEIN
NEIN
ANTWORTEN
5
5
ZUGRIFFE
419
419
EMPFEHLEN
-
08.09.10 11:41 #1CuteProgrammer Tutorials.de Gastzugang
Hallo!
Folgendes Szenario. Ich habe eine Tabelle, mit einem einfachen Primary Key und ein paar weiteren Spalten.
Allerdings werden auch öftersmal ein paar Zeilen wieder gelöscht, wodurch natürlich ein Primary Key wieder frei wird, diesen Primary Key möchte ich nun wieder vergeben. Deshalb meine Frage:
Kann man per SQL den ersten verfügbaren Primary Key auslesen?
Bis jetzt arbeite ich immer mit
um einen PK zu bekommen.Code :1
SELECT MAX(....)+1 FROM ....
Ich hoffe ein paar Leute, die sich besser mit SQL auskennen als ich, können mir helfen.
lg
-
Habs zwar nur mit MySQL getestet, da ich grad keine Oracle-DB zur Hand habe, sollte aber etw so gehen
Code sql:1 2 3 4 5 6 7 8
SELECT MIN(newIds.newId) AS firstNotUsedId FROM (SELECT id + 1 AS newId FROM test) AS newIds LEFT JOIN (SELECT id FROM test ) AS ids ON newIds.newId = ids.id WHERE ids.id IS NULL;
---------------------------------------------------------------------------------------------------
item: Tutorial: [PHP][MySQL] Debug Queries
item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben
-
Hallo,
ohne groß über die inhaltliche Fragen der Anforderung nachzudenken hier eine technische Lösung über die analytische LEAD-Funktion:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
-- Anlage einer Testtabelle mit 10000 Sätzen create table test as select rownum pk_col from dual connect by level <= 10000; -- Anlage eines PK dazu alter table test add constraint test_pk primary key (pk_col); -- Löschung von 9 zufälligen Werten delete from test where pk_col in (select round(dbms_random.value * 10000) from dual connect by level < 10); -- Bestimmung des niedrigsten gelöschten Wertes select min(pk_col) + 1 first_gap from (select pk_col , lead(pk_col) over(order by pk_col) next_pk_value from test) where next_pk_value - pk_col > 1 -- in meinem Fall FIRST_GAP --------- 1353
Gruß
MP
-
08.09.10 12:25 #4CuteProgrammer Tutorials.de Gastzugang
Danke MP, hat wunderbar funktioniert ******
-
-
da wären wir dann bei den inhaltlichen Fragen. Zum Thema lückenloser Sequenzen hat Tom Kyte allerlei Kritisches geschrieben, was man bei AskTom nachlesen kann, und er hat dafür gute Gründe.
Im Fall konkurrierender Zugriffe könnte der wert bereits wieder vergeben sein, sofern man keine komplexere Transaktionssteuerung verwenden wollte (und das wird man in aller Regel nicht wollen).
Wenn aber bisher SELECT MAX(...) + 1 funktioniert hat, dann wird jetzt auch diese Operation funktionieren (oder auch die Variante mit dem Abgleich gegen eine Referenzmenge). Ob das sinnvoll ist, hängt in der Tat von den fachlichen Bedingungen ab.
Gruß
MP
Ähnliche Themen
-
Oracle 10.2.0.4 INDEX (Primary key) versus BITMAP INDEX
Von planb2000 im Forum Relationale DatenbanksystemeAntworten: 2Letzter Beitrag: 25.03.10, 16:33 -
Oracle/Mysql/HSQLDB - Interne Nummer der Spalte mit Primary Key
Von sceppi im Forum Relationale DatenbanksystemeAntworten: 0Letzter Beitrag: 05.08.08, 09:34 -
[Oracle] Sehr viele interessante Präsentationen zum Thema Oracle und Sicherheit
Von Thomas Darimont im Forum Relationale DatenbanksystemeAntworten: 1Letzter Beitrag: 24.01.07, 19:02 -
[Oracle] Primary Key Wert Ändern?
Von wSam im Forum Relationale DatenbanksystemeAntworten: 1Letzter Beitrag: 28.06.06, 11:32 -
[C/C++] frei verfügbarer Ressource Editor?
Von Crayzee Ivan im Forum C/C++Antworten: 2Letzter Beitrag: 09.09.02, 21:16





Zitieren


Login




