Announcement

Collapse
No announcement yet.

Primary Key mittels SP

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Primary Key mittels SP

    HI,

    Also, mein problem ist folgendes ich möchte einträge erstellen, wobei der PK automatisch erzeugt werden soll. Ich möchte jedoch nicht mit einem autoincrement arbeiten, da sehr viel gelöscht und wieder eingefügt wird.
    Mir würde schon eine gute doku für SP in MS SQL 05 reichen, da sich diese ja von der herkömmlichen syntax unterscheidet. Ich möchte die prozedur so schreiben, dass sie lücken zwischen den pk´s sucht und diese füllt

    als bsp:

    PK
    1
    2
    3
    5

    mit einem auto increment würde der neue PK 6 sein, ich möchte jedoch zwischen 3 und 5 einfügen also 4. Ich bin noch relativ neu im sql sektor und möchte wissen ob es möglich ist die pk´s miteinander zu vergleichen ... also die 2 spalten miteinander zu vergleichen (denn wenn pk+1 != pkn) dann kann dort ja der neue erstellt werden.

    mfg Markus

  • #2
    Dann erkläre mir mal bitte, warum keine fortlaufende Nummer verwendet werden kann, sondern Lücken verwendet werden sollen? Normalerweise ist das nur aus der Angst heraus, die Anzahl der Nummern könnte zu wenig sein. Da kann ich nur raten, sich einmal autoidentity mit integer anzusehen: geht bis 2.147.483.647 --> wenn man davon 30.000 Nummern pro Tag brauchen würde, käme man damit trotzdem 71582 Tage aus = 196 Jahre.
    Und wenn das nicht reicht, gibt es ja immer noch bigint

    bye,
    Helmut

    Comment


    • #3
      Hi,

      Lies' Dir mal den folgenden Thread durch:

      http://entwickler-forum.de/showthread.php?t=45852

      Gruß,
      Karsten

      Comment


      • #4
        Und falls es trotz allem (auch ich finde die Idee nicht so toll, aber wie halt so gelegentlich die Anforderungen sind) es weiter bei einem eigenen Zähler bleiben soll, hier ein Beispiel dafür.

        [highlight=SQL]CREATE TABLE #PK
        (myID int)
        GO

        -- Test mit leerer Tabelle
        SELECT ISNULL(MIN(M.myID), 0) + 1
        FROM #PK AS M
        LEFT JOIN #PK AS S
        ON M.myID = S.myID - 1
        WHERE s.myID IS NULL
        GO
        -- Tabelle mit Beispiel-Daten füllen
        INSERT INTO #PK VALUES (1);
        INSERT INTO #PK VALUES (2);
        INSERT INTO #PK VALUES (4); -- 3 fehlt
        INSERT INTO #PK VALUES (5);

        -- Test mit teilgefüllter Tabelle
        SELECT ISNULL(MIN(M.myID), 0) + 1
        FROM #PK AS M
        LEFT JOIN #PK AS S
        ON M.myID = S.myID - 1
        WHERE s.myID IS NULL
        GO

        -- Lücke schließen
        INSERT INTO #PK VALUES (3);
        GO

        -- Test mit komplett gefüllter Tabelle
        SELECT ISNULL(MIN(M.myID), 0) + 1
        FROM #PK AS M
        LEFT JOIN #PK AS S
        ON M.myID = S.myID - 1
        WHERE s.myID IS NULL
        GO

        DROP TABLE #PK[/highlight]

        Viel Spaß dabei, es in einer MultiUser-Umgebung transaktionssicher ohne Deadlocks usw. hin zu bekommen.
        Olaf Helper

        <Blog> <Xing>
        * cogito ergo sum * errare humanum est * quote erat demonstrandum *
        Wenn ich denke, ist das ein Fehler und das beweise ich täglich

        Comment


        • #5
          danke für die schnelle hilfe^^

          naja der betreuer meiner diplomarbeit hällt nichts von auto increments (zitat: die bringen dich nur in teufels küche)

          Comment

          Working...
          X