AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Automatische ID-Generierung... wie macht ihr das?
Thema durchsuchen
Ansicht
Themen-Optionen

Automatische ID-Generierung... wie macht ihr das?

Ein Thema von Alphacodex · begonnen am 17. Aug 2009 · letzter Beitrag vom 17. Aug 2009
Antwort Antwort
Alphacodex

Registriert seit: 16. Mär 2006
65 Beiträge
 
Delphi 2006 Professional
 
#1

Automatische ID-Generierung... wie macht ihr das?

  Alt 17. Aug 2009, 18:01
Datenbank: Firebird • Version: 2.5 • Zugriff über: Interbase
Hallo,

ich hab noch eine Grundsatzfrage an Euch:

Es macht ja Sinn, dass jeder Record in jeder Datenbanktabelle eine fortlaufende, unique ID hat, anhand dessen man den Record eindeutig wiederfindet. Es würde meiner Ansicht nach auch Sinn machen, wenn diese IDs von der Datenbank selbst verwaltet werden und ich nicht von Delphi aus sicherstellen muss eine eindeutige ID zu finden.

Ich habe per Google folgenden Tipp gefunden, bei dem ich einen Trigger definiere sobald jemand versucht einen neuen Record ohne ID anzulegen:
SQL-Code:
CREATE OR ALTER trigger stunden_bi for stunden
active before insert or update position 0
as
begin
  if (new.kontaktid is null) then
    new.kontaktid = gen_id(gen_stunden_id,1);
end
So, jetzt müsste ich von Delphi aus einen Record ohne diese ID schicken, damit er sie automatisch anlegt (gen_id ist übrigens ein Generator, der fortlaufende Nummern vergibt). Also z.B. irgendwie sowas
insert into stunden (KUNDE, FAHRTZEIT) values (:KUNDE, :FAHRTZEIT) und weil ich ihm ja keine KONTAKTID gebe, sollte der Trigger anspringen und diese erzeugen...

Leider funktioniert das Ganz nicht. Er meckert immer dass ich gegen den UNIQUE OR PRIMARY KEY CONSTRAINT verstoße (weil ich versuche einen Record ohne diese ID anzulegen).

Bin ich mit der Methode völlig auf dem Holzweg, oder wie macht ihr das?


Vielen Dank
Codex
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Automatische ID-Generierung... wie macht ihr das?

  Alt 17. Aug 2009, 18:05
Eigentlich müsste das mit dem Trigger funktionieren, allerdings würde ich den etwas abändern:
SQL-Code:
CREATE OR ALTER trigger stunden_bi for stunden
active before insert position 0
as
begin
  new.kontaktid = gen_id(gen_stunden_id,1);
end
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Automatische ID-Generierung... wie macht ihr das?

  Alt 17. Aug 2009, 18:06
Zitat:
gen_id ist übrigens ein Generator
Nein es ist einen Semaphoren-Funktion, mit welcher man den Generator(Sequenz) gen_stunden_id erhöht ( in deinem fall um 1)
Zitat:
Bin ich mit der Methode völlig auf dem Holzweg, oder wie macht ihr das?
Nein sollte eigentlich so funktionieren.
Existiert noch ein anderes UNIQUE Feld?
Markus Kinzler
  Mit Zitat antworten Zitat
khh

Registriert seit: 18. Apr 2008
Ort: Südbaden
1.903 Beiträge
 
FreePascal / Lazarus
 
#4

Re: Automatische ID-Generierung... wie macht ihr das?

  Alt 17. Aug 2009, 18:10
Zitat von DeddyH:
Eigentlich müsste das mit dem Trigger funktionieren, allerdings würde ich den etwas abändern:
SQL-Code:
CREATE OR ALTER trigger stunden_bi for stunden
active before insert position 0
as
begin
  new.kontaktid = gen_id(gen_stunden_id,1);
end

den passenden Generator muss es natürlich auch geben

EDIT: zu spät
Karl-Heinz
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Automatische ID-Generierung... wie macht ihr das?

  Alt 17. Aug 2009, 18:11
Das sollte Firebird aber beim Kompilieren anmeckern, wenn es den Generator nicht gibt
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Alphacodex

Registriert seit: 16. Mär 2006
65 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Automatische ID-Generierung... wie macht ihr das?

  Alt 17. Aug 2009, 18:41
Der Generator existiert und Firebird meckert auch nicht...

Es ist nur der Primary-Key und ein Foreign-Key definiert, letzterer bekommt aber immer einen sinnvollen Wert. Er meckert auch nur über die Verletzung des Primary-Keys. Das macht er übrigens auch wenn ich Delphi ganz umgehe und innerhalb von IB Expert einen neuen Record anlege bei dem ich einfach das PrimaryKey Feld leer lasse.

EDIT: Oh ich Depp!! Was war das Problem?? Der Generator war aus irgendwelchen Gründen auf 0 gestanden und 0 gabs schon...

Ist das eigentlich irgendwann ein Problem wenn man in der Datenbank munter hinzufügt und löscht und dann nach überall Lücken in den IDs sind. Rein theoretisch könnten dann ja irgendwann die IDs ausgehen, oder??


Grüße
Codex
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Automatische ID-Generierung... wie macht ihr das?

  Alt 17. Aug 2009, 18:48
Zitat:
What is the maximum value of a generator?
Generators store and return 64-bit values in all versions of Firebird. This gives us a value range of:
-263 .. 263-1 or -9,223,372,036,854,775,808 .. 9,223,372,036,854,775,807
So if you use a generator with starting value 0 to feed a NUMERIC(18) or BIGINT column (both
types represent 64-bit integers), and you would insert 1000 rows per second, it would take around 300
million years (!) before it rolls over. As it is pretty unlikely mankind will still walk on this planet by
then (and still use Firebird databases), that's nothing to be really worried about.
Quelle: http://www.firebirdsql.org/pdfmanual...ator-Guide.pdf
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: Automatische ID-Generierung... wie macht ihr das?

  Alt 17. Aug 2009, 18:50
Zitat:
Ist das eigentlich irgendwann ein Problem wenn man in der Datenbank munter hinzufügt und löscht und dann nach überall Lücken in den IDs sind. Rein theoretisch könnten dann ja irgendwann die IDs ausgehen, oder??
Kommt auf den typ des Feldes an. BIGINT sollte aber ein Weilchen reichen.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: Automatische ID-Generierung... wie macht ihr das?

  Alt 17. Aug 2009, 18:54
Zitat von mkinzler:
BIGINT sollte aber ein Weilchen reichen.
Jepp, siehe mein Zitat oben
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman
Online

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.292 Beiträge
 
Delphi 12 Athens
 
#10

Re: Automatische ID-Generierung... wie macht ihr das?

  Alt 17. Aug 2009, 19:08
Zitat:
insert 1000 rows per second, it would take around 300
million years (!)
...puh, das wird knapp
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:09 Uhr.
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