Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi ID bei neuem Datensatz automatisch hochzählen (https://www.delphipraxis.net/194262-id-bei-neuem-datensatz-automatisch-hochzaehlen.html)

Mokus 3. Nov 2017 15:46

AW: ID bei neuem Datensatz automatisch hochzählen
 
ps.
vielleicht hilft das ja schon ?

http://www.delphipraxis.net/85745-da...ds-finden.html

Uwe Raabe 3. Nov 2017 15:51

AW: ID bei neuem Datensatz automatisch hochzählen
 
Wenn das AutoInc-Feld als TFDAutoIncField angelegt ist (sollte bei automatischer Erkennung der Fall sein), dann kannst du über IdentityInsert den Wert vorgeben.

Luca Haas 3. Nov 2017 15:55

AW: ID bei neuem Datensatz automatisch hochzählen
 
Zitat:

Zitat von jobo (Beitrag 1385022)
Wofür möchtest Du die ID benutzen?

Also es geht um keinen Primärschlüssel, ich möchte damit quasi das n einer 1:n Beziehung darstellen.

DeddyH 3. Nov 2017 16:05

AW: ID bei neuem Datensatz automatisch hochzählen
 
Bei 1:n zeigen n Datensätze auf einen. Üblicherweise wird das durch einen Primärschlüssel auf der "1"-Seite und einen Fremdschlüssel auf der "n"-Seite realisiert. Dabei ist es aber völlig unerheblich, welchen Wert der Primärschlüssel hat und ob dort vielleicht Lücken vorliegen. Also nochmal für Doofe wie mich: wozu genau benötigst Du den Wert und wieso soll man ihn nachträglich ändern können?

nahpets 3. Nov 2017 16:06

AW: ID bei neuem Datensatz automatisch hochzählen
 
Dabei muss n weder eine Zahl, noch lückenlos sein, sondern höchstens nur irgendwas, was man aufsteigend soritieren kann, sofern n auch als Sortierkriterium dienen soll.

Die Ergebnisreihenfolge bei 'ner aufsteigenden Sortierung der ID ändert sich ja nicht, wenn die 4 fehlt.

Und wenn der nächste Satz einfach die erste freie ID bekommt, dürfte die ID kaum als (sinnvolles) Sortierkriterium dienen können. Es bedeutet dann ja nur: Ist nach ID sortiert, aber z. B. nicht in der Reihenfolge des Einfügens in die Datenbank ...

Ohne genaue Beschreibung der Notwendigkeit, halt' ich das für 'ne unnütze Spielerei ohne irgendeinen Mehrwert.

AutoInc-Werte sind nunmal dazu da, dass ein neuer Satz eine neue Nummer am Ende des genutzten Nummernkreises erhält. Sie ist nicht für irgendwelche sonstigen fachlichen Sachen geeignet, jedenfalls dann nicht, wenn man den Wert anschließend beliebig ändern kann.

So 'ne ID soll die Eindeutigkeit sichern, was bei wiederholter Verwendung aber wohl kaum dauerhaft sicher und fehlerfrei zu garantieren ist.

jobo 3. Nov 2017 20:47

AW: ID bei neuem Datensatz automatisch hochzählen
 
Zitat:

Zitat von Luca Haas (Beitrag 1385027)
Zitat:

Zitat von jobo (Beitrag 1385022)
Wofür möchtest Du die ID benutzen?

Also es geht um keinen Primärschlüssel, ich möchte damit quasi das n einer 1:n Beziehung darstellen.

Du kannst auch 1:n Beziehungen vollkommen ohne die von Dir genannten Kriterien "aufsteigend", "lückenfrei" usw. erstellen.
1:n sagt, zu einem bestimmten (genau bestimmbaren) Datensatz in einer Tabelle A, gibt es in einer anderen Tabelle B n Datensätze, die genau zu dem einen in Tabelle A gehören. Dies wird dadurch realisiert, dass die n Datensätze der Tabelle B in einer bestimmten Spalte den identischen Wert aus Tabelle A führen.

Es ist sozusagen State of the Art, diese Werte als ID/ Primärschlüssel und Fremdschlüssel zu bezeichnen.

Damit Entwickler und alle, die es wissen sollten, das leicht erkennen, gibt es zu diesen Begriffen auch analoge Sprachkonstrukte in SQL. Die ermöglichen die explizite Definition von Primary und Foreign Keys (Primär / Fremdschlüssel), was es wiederum dem Datenbanksystem erlaubt, diese Vorgaben zu überwachen und deren Einhaltung zu garantieren(!).

Alternativ kannst Du komplett ohne diese Begriffe und Definitionen und ihre Kenntnis arbeiten, nur durch die Anwendung von SQL Mengenoperationen. Damit verschenkst Du erhebliche Teile der Datenbankfunktionalität.

Oder noch mal andersrum:
Wenn Du selber fachlich keinen Bedarf an der Lückenlosigkeit der Zahlen hast, den hat auch niemand anders. Jedenfalls nicht die Datenbank und auch nicht eine 1:n Beziehung. Vergiss es einfach.

Neumann 4. Nov 2017 08:02

AW: ID bei neuem Datensatz automatisch hochzählen
 
Bei einigen unserer Kunden hat der beschriebene und auch nicht einfach zu vermeidende Umstand dass per Autoinc erzeugte Werte nicht unbedingt lückenlos sind, schon zu Misstrauen bei Betriebsprüfungen durch das Finanzamt geführt. Dabei ging es nicht um Rechnungsnummern, wo ich das noch verstehen könnte, sondern um Datensatz-IDs von Buchungen.

Die beste Lösung für dieses Problem ist einfach: Man macht diese Werte, die der Anwender ja eigentlich weder zu sehen noch zu bearbeiten hat einfach unsichtbar.

p80286 4. Nov 2017 09:09

AW: ID bei neuem Datensatz automatisch hochzählen
 
Da die ID eine Verwaltungsinformation der DB ist, hat sie ausserhalb der selbigen keinen Informationswert. Es sei denn, Du möchtest die Eintragung von Daten in einer zeitlichen Abfolge betrachten (Debugging). Was auch nur möglich ist wenn die ID über autoinc generiert wird.
Wenn Du zb. 5 neue Datensätze generierst und diese per rollback verwirfst, hast Du schon eine Lücke von 5 Werten.
Auch wenn es schon gesagt wurde, die ID dient einzig der eindeutigen Identifizierung des Datensatzes. Welchen Wert sie hat, ist vollkommen unerheblich.

Gruß
K-H

bnreimer42 4. Nov 2017 09:21

AW: ID bei neuem Datensatz automatisch hochzählen
 
Ich bin immer wieder verwundert, wie viele Gedanken man sich über die IDs machen kann.

Selbstverständlich sind die IDs reine technische Schlüssel und dürfen keine Semantik haben! Sonst ist das DB-Design "defekt".

Insbesondere darf man die IDs nie als Rechnungsnummer oder Aktenzeichen oder soetwas ähnliches benutzen. Dazu muss man eine eigenes Feld verwenden!

Daraus ergibt sich, dass IDs immer über AutoInc-Mechanismen (Oder bei Firebird Trigger mit gen_id()-Aufruf) erstellt werden sollten.

Ich mache mir auch keine Gedanken mehr, ob eine Tabelle ein ID-Feld benötigt: Es schadet nicht, wenn jede Tabelle eines hat und es hilft in jedem Fall, wenn man exakt einen Datensatz ansprechen will, z.b. beim Bearbeiten.


Einzig valide Frage ist, wie kommt man - um z.B. eine Fremdschlüsselbeziehung zu einem neuen Datensatz anzulegen, an den letzten ID-Wert und das geht prinzipiell immer erst, wenn der Datensatz in der DB gespeichert ist.

Bei u.a. Firebird gibt es dazu das wunderbare RETURNING-Konstrukt um bei einem Insert gleich Werte (z.B. die des ID-Feldes) zurückzubekommen.

Für FireDAC gibt es die schöne Doku-Seite http://docwiki.embarcadero.com/RADSt...lder_(FireDAC), die dazu alles zusammenfasst.

Luca Haas 6. Nov 2017 07:57

AW: ID bei neuem Datensatz automatisch hochzählen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Okay ich sehe grade, dass ich am Freitag ganz schön großen Mist geschrieben habe :oops:
Also ich haben 2 Tabellen, eine in der nur eine ID und eine "Aufgabe" steht, in der anderen Tabelle habe ich dann die jeweilige ID der Aufgabe, sowie alle Arbeitsschritte mit einer Position.
Diese Position hätte ich am liebsten durchgehend, mit der ID habe ich kein Problem

Falls jemand meinen Aufbau nicht verstanden hat, habe ich einen Screenshot angehangen


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:20 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz