Zu den Aufzeichnungen der tutorials.de-Live-Workshops
ERLEDIGT
NEIN
ANTWORTEN
5
ZUGRIFFE
419
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    CuteProgrammer 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
    Code :
    1
    
    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
     

  2. #2
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    4.613
    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

  3. #3
    MPr MPr ist offline Mitglied Silber
    Registriert seit
    Oct 2006
    Ort
    Saarbrücken
    Beiträge
    82
    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
     

  4. #4
    CuteProgrammer Tutorials.de Gastzugang
    Danke MP, hat wunderbar funktioniert ******
     

  5. #5
    dbwizard dbwizard ist offline Mitglied Brokat
    Registriert seit
    May 2007
    Ort
    Zürich
    Beiträge
    285
    Zitat Zitat von CuteProgrammer Beitrag anzeigen
    Danke MP, hat wunderbar funktioniert ******
    Aber du weisst, dass so etwas eher sinnfrei ist ? Was ist den die konkrete Anforderung ? Im weiteren "scheint" es nur zu funktionieren, in einer Multiuserumgebung ist dies schlicht und einfach falsch


    Gruss
     

  6. #6
    MPr MPr ist offline Mitglied Silber
    Registriert seit
    Oct 2006
    Ort
    Saarbrücken
    Beiträge
    82
    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

  1. Oracle 10.2.0.4 INDEX (Primary key) versus BITMAP INDEX
    Von planb2000 im Forum Relationale Datenbanksysteme
    Antworten: 2
    Letzter Beitrag: 25.03.10, 16:33
  2. Oracle/Mysql/HSQLDB - Interne Nummer der Spalte mit Primary Key
    Von sceppi im Forum Relationale Datenbanksysteme
    Antworten: 0
    Letzter Beitrag: 05.08.08, 09:34
  3. [Oracle] Sehr viele interessante Präsentationen zum Thema Oracle und Sicherheit
    Von Thomas Darimont im Forum Relationale Datenbanksysteme
    Antworten: 1
    Letzter Beitrag: 24.01.07, 19:02
  4. [Oracle] Primary Key Wert Ändern?
    Von wSam im Forum Relationale Datenbanksysteme
    Antworten: 1
    Letzter Beitrag: 28.06.06, 11:32
  5. [C/C++] frei verfügbarer Ressource Editor?
    Von Crayzee Ivan im Forum C/C++
    Antworten: 2
    Letzter Beitrag: 09.09.02, 21:16