Oracle - Erster verfügbarer Primary Key

  • Themenstarter Themenstarter CuteProgrammer
  • Beginndatum Beginndatum
C

CuteProgrammer

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
Code:
SELECT MAX(....)+1 FROM ....
um einen PK zu bekommen.

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
SQL:
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;
 
Zuletzt bearbeitet von einem Moderator:
Hallo,
ohne groß über die inhaltliche Fragen der Anforderung nachzudenken hier eine technische Lösung über die analytische LEAD-Funktion:
Code:
-- 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
 
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
 
Zurück