PDA

View Full Version : Lfnr innerhalb des 'eigendlichen' Key vergeben



Seiten : [1] 2 3 4

Robi
27-05-21, 08:56
Moin,
hier steht ja beschrieben, wie das mit der Lfd nr geht (http://newsolutions.de/forum-systemi-as400-i5-iseries/threads/20687-SQL-CREATE-TABLE-automatisher-Satzz%C3%A4hler/page2)

Ich bräuchte nun eine LfNr innerhalb des 'Restlichen Keys'

Key:
F1, F2, F3 + LfNr

a, b, c, 1
a, b, c, 2
...
a, b, c, 189
...

x, y, z, 1
x, y, z, 2
...

mit Key 1, 2 und 3 kann es /Tag 150- 300 Sätze geben.
Datum und Uhrzeit ist recht lang und eigendlich egal.
Nicht Unique geht aus anderen Gründen nicht.

Bisher ist das 'händisch' gelöst.
Aber ne neue Tabelle könnte ja mal 'modern' (was immer das bedeutet) gemacht werden.
Geht das per 'SQL-Automatik?

Danke
Robi

Fuerchau
27-05-21, 09:11
Einfache Antwort: nö!
Aber du kannst eine Halbautomatik verwenden.
Per Before-Insert-Trigger kannst du dir an Hand des Schlüssels die nächste Nummer ermitteln, falls noch keine vorhanden ist, den Wert 1 setzen.
Allerdings muss man bedenken, dass dies durchaus parallel passiert und es dann zu doppelten Schlüsseln führt.

Du kannst aber auch eine Identity-Column nehmen. Die nummeriert über Alles.
Bei sequentiellen Abfragen nimmst du eine "ROW_NUMBER over(partition by k1,..., kn order by identity)" dazu.

Dies hat auch den Charme, dass die Identity als Primary-Key für Update/Delete-Operationen sowie referential constraints verwendet werden kann.

BenderD
27-05-21, 09:39
... geht nicht gibts (fast) nicht:
Wenn keiner auf die Tabelle per Rekord Löffel Ekzem los geht, kann man die Tabelle durch eine View ersetzen und dann per instead of Trigger funktionale Logik dazwischen klemmen. Das Problem doppelter Nummern kriegt man (auch in Baldurs Variante) per korrektem Commit Handling (nicht ganz trivial) weg.

@Baldurs Variante: das wird bei referentiellen Beziehungen tricky.

D*B

Robi
27-05-21, 09:52
Schade,
ne bewährte 'Hand am Arm' Methode haben wir.
Danke Euch ...

B.Hauser
27-05-21, 10:03
Sofern es nur um einen eindeutigen Wert geht und der Zähler nicht für jeden Key bei 1 anfangen muss, kann auch mit einem SEQUENCE Objekt gearbeitet werden. Aus dem Sequence Object kann der nächste Zähler ermittelt werden. Mit jeder neuen Anfrage wird der nächste Wert ausgegeben. Bei einem Rollback bleibt die Sequence unverändert, d.h. der Wert wird nicht zurückgesetzt.

Mit dem folgenden Statement kannst Du ein Sequence Object erstellen:

Create Sequence YourSchema.YourSeq As Integer Start With 1;

Mit dem folgenden Befehl, der in SQL eingebunden werden kann, kannst Du den nächsten Wert ermitteln:

Next Value For YourSchema.YourSeq;


Insert into yourTable (yourSeqCol, ....)
Values(Next Value For YourSchema.YourSeq, ....);

Birgitta

Fuerchau
27-05-21, 10:21
https://www.ibm.com/docs/en/i/7.2?topic=language-creating-altering-identity-column

Wie heißt es so schön: Sequence ist obsolet, Identity ist nun state of the art.
Dann passiert alles automatisch, next value of braucht man dann nicht, und auf Identity habe ich ja hingewiesen;-).

Sequence ist nur noch relevant, wenn man eine Nummer über mehrere Tabellen haben möchte.

BenderD
27-05-21, 10:28
... was die IBM uns gnädig gibt, muss man auch nehmen.

D*B

@Nummer über mehrere Tabellen: da würde ich meinen Nackenhaaren vertrauen (die sträuben sich gerade) und über das Datenbank-Design nachdenken!

Fuerchau
27-05-21, 10:33
Nun ja, Identity ist bei anderen DB's schon eher Standard;-).
Ich habe auch schon Fehler gesucht wegen doppelter Sequence weil einer sich beim Insert vertippt hatte.
Da gab es die Regel, Namen zu nummerieren. Tabellen mit Dnnnn, Sequence mit Snnnn. DA kann man schon mal daneben liegen.

Andreas_Prouza
27-05-21, 11:00
Die Identity Spalte kannst du mit anderen Spalten über den Primary Key kombinieren.
Dann kann es eben die gleiche Identity Nummer mehrfach geben, wenn die anderen Primary Key Spalten unterschiedlich sind.
Für mich ist die ID Spalte immer eindeutig.
Du hast sonst auch Probleme wenn du via Forgein-Key Tabellen miteinander verknüpfen möchtest.

Fuerchau
27-05-21, 11:36
Eine Identity-Spalte muss Unique sein, daher eigentlich auch Primary Key, sonst geht der Begriff "Identity" verloren.
Allerdings kann man für Sortierzwecke die Identity-Spalte zusätzlich auch nach anderen Schlüsseln hinzufügen.