![]() |
Datenbank: Firebird • Version: 2.5 • Zugriff über: SQL
Vergabe einer Nummer
Hallo
Ich habe ein Grid, das Grid enthält ein Feld namens Schlüsselnummer. Dieses Feld habe ich mit einem UNQ bestückt. Die nummer darf nur einmal vorkommen. Wenn ich die Anwendung öffne und ein neuen datensatz einfügen möchte, wie schaffe ich es das wenn ich eine neue zeile erschaffe das Feld Schlüsselnummer bereits eine neue nummer vergeben bekommen hat und diese nicht mehr überschreibbar ist?. |
AW: Vergabe einer Nummer
Eigentlich wird die Nummer erst beim Post neu erzeugt. Du kannst diese abe auch vorab holen:
SQL-Code:
(Voraussetzung das der Trigger nur bei NULL-Werten eine neue Nummer erzeugt, sonst wird beim Einfügen eine weitere Nummer geholt).
select GEN_ID( <Generatorname>, <Schrittweite>) from rdb$database;
Im Grid müsste diese Spalte dann readonly sein |
AW: Vergabe einer Nummer
Wird der Wert nicht vom DBMS automatisch erzeugt oder soll das wirklich deine Anwendung machen?
Ich kenne Firebird jetzt nicht, aber wie verlässlich ist das denn, sich den Schlüssel im Vorab zu holen und darauf zu hoffen, dass in der Zwischenzeit niemand anderes einfügt und diesen Wert schon "verbraucht"? |
AW: Vergabe einer Nummer
Mit den Generatoren kann man das machen. Der nächste würde dann die nächsthöhere Nummer holen, auch wenn der erste noch nicht gespeichert hat. So könnte es natürlich zu Lücken in der Nummernvergabe kommen, aber das ist ja bei Primärschlüsseln meistens egal.
Kann man auch per Trigger + Generator lösen, dann hat man quasi ein Autoinc-Feld. |
AW: Vergabe einer Nummer
Zitat:
Es ist dabei dann egal, ob ich ihn heute oder morgen oder nächstes Jahr in die Datenbank schreibe, vergeben ist vergeben. Das Einzige, was zwingend ist: Jeder, alle ... wie auch immer... müssen sich den Wert über die Sequenz holen. Und wenn ich mir einen Wert hole und diesen dann nicht nutze, dann ist in der Tabelle für diesen Wert halt eine Lücke, die nie wieder aufgefüllt werden wird. Eine Sequenz liefert bei jedem Zugriff einen neuen Wert, unabhängig davon, ob irgendeiner der vorher erzeugten Werte jemals genutzt wurde. Wenn natürlich irgendwer einfach so irgendwelche Werte nutzt, die er sich selbst erfindet, so kann es zu doppelten Werten kommen, das heißt aber auch: Da hat jemand nicht regelkonform mit der Datenbank gearbeitet. Über eine Sequenz ist eine doppelte Vergabe eines Wertes nicht möglich, von daher kann es die Situation: aber wie verlässlich ist das denn, sich den Schlüssel im Vorab zu holen und darauf zu hoffen, dass in der Zwischenzeit niemand anderes einfügt und diesen Wert schon "verbraucht"? nicht geben. Ähnlich wie bei einer GUID. Die ist (per Definition) eindeutig, wenn Du sie nutzt, dann schön, wenn nicht, wird niemand mehr diese GUID (zufällig) erzeugen und verwenden können. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:54 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz