AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Verständnisfrage Autoinc bei Firebird
Thema durchsuchen
Ansicht
Themen-Optionen

Verständnisfrage Autoinc bei Firebird

Ein Thema von zeras · begonnen am 26. Dez 2010 · letzter Beitrag vom 26. Dez 2010
Antwort Antwort
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.643 Beiträge
 
Delphi 12 Athens
 
#1

Verständnisfrage Autoinc bei Firebird

  Alt 26. Dez 2010, 13:33
Datenbank: Firebird • Version: 2.5 • Zugriff über: IB
Ich nutze folgenden SQL Code zum Erstellen einer Tabelle. Das geht soweit
Code:
CREATE TABLE "LIZENZ"
(
  "ID"         INTEGER NOT NULL,
  "Firma"     VARCHAR(80),
  "Notes"      BLOB SUB_TYPE TEXT SEGMENT SIZE 80,
  FOREIGN KEY      ("Programm_ID")
  REFERENCES    PROGRAMME("Programm_ID")
);
Dazu noch einen Trigger

Code:
CREATE TRIGGER "AUTOINC" FOR "LIZENZ"
ACTIVE BEFORE INSERT POSITION 0
as
begin
 new.id = gen_id( autoinc, 1 );
end
Wenn ich nun über ein DBGrid und DBNavigator neue Daten einfügen will, dann trage ich doch bei ID nichts ein, da das Firebird für mich erledigt. Das dachte ich mir jedenfalls. Wenn ich nun neue Daten eintragen und dann sichern will, kommt die Meldung, dass das Feld ID einen Wert haben muss.
Was mache ich falsch?
Matthias
Es ist nie falsch das Richtige zu tun!
- Mark Twain
  Mit Zitat antworten Zitat
Benutzerbild von FBrust
FBrust

Registriert seit: 4. Okt 2002
Ort: Saarbrücken
654 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Verständnisfrage Autoinc bei Firebird

  Alt 26. Dez 2010, 13:52
Hallo,

da fehlt wohl der sog. Generator.

Wenn Du z. b. mit IBExpert oder ähnlichen Tools eine Tabelle erstellst, siehst Du sehr schön die dabei erzeugten Skripte.

Gruß
Frank
"Ich habe Dinge gesehen, die ihr Menschen niemals glauben würdet. Gigantische Schiffe, die brannten, draußen vor der Schulter des Orion" - Roy Batty
  Mit Zitat antworten Zitat
ThomasBab

Registriert seit: 7. Mai 2007
Ort: Hallenberg
57 Beiträge
 
FreePascal / Lazarus
 
#3

AW: Verständnisfrage Autoinc bei Firebird

  Alt 26. Dez 2010, 13:53
Hallo!

Nur ganz kurz, es ist ja Weihnachten.


1. ID würde ich als bigint definieren, könnte sonst knapp werden.

2. Hier ein Beispiel aus einer Tabelle in einer Datenbank von mir, ohne weiteren Kommentar:

Code:
/******************************************************************************/
/*                 Generated by IBExpert 26.12.2010 13:51:15                  */
/******************************************************************************/

/******************************************************************************/
/*        Following SET SQL DIALECT is just for the Database Comparer        */
/******************************************************************************/
SET SQL DIALECT 3;



/******************************************************************************/
/*                                   Tables                                  */
/******************************************************************************/


CREATE GENERATOR ID;

CREATE TABLE USERLIST (
    ID       BIGINT NOT NULL,
    ANGELEGT DATUMUHRZEIT NOT NULL /* DATUMUHRZEIT = TIMESTAMP */,
    BENUTZER VCHAR30 NOT NULL COLLATE DE_DE /* VCHAR30 = VARCHAR(30) */,
    SOUNDEX  CHAR(6) COLLATE DE_DE
);




/******************************************************************************/
/*                                Primary Keys                               */
/******************************************************************************/

ALTER TABLE USERLIST ADD CONSTRAINT PK_USERLIST PRIMARY KEY (ID);


/******************************************************************************/
/*                                  Indices                                  */
/******************************************************************************/

CREATE INDEX USERLIST_IDX1 ON USERLIST (SOUNDEX);
CREATE INDEX USERLIST_IDX2 ON USERLIST (BENUTZER);


/******************************************************************************/
/*                                  Triggers                                 */
/******************************************************************************/


SET TERM ^ ;



/******************************************************************************/
/*                            Triggers for tables                            */
/******************************************************************************/



/* Trigger: USERLIST_BIU0 */
CREATE OR ALTER TRIGGER USERLIST_BIU0 FOR USERLIST
ACTIVE BEFORE INSERT OR UPDATE POSITION 0
AS
begin
if (new.id is null) then
    new.id = gen_id(id, 1);
    if (new.angelegt is null) then
    new.angelegt = current_timestamp;
    new.soundex = f_soundex(f_upper(new.benutzer));
end
^


SET TERM ; ^
Gruß
Thomas
Thomas
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#4

AW: Verständnisfrage Autoinc bei Firebird

  Alt 26. Dez 2010, 14:02
1. ID würde ich als bigint definieren, könnte sonst knapp werden.
Nun ja. Mir haben 2 Mrd immer gereicht. Was speicherst Du denn? Alle Bakterien dieser Welt?

Bei dem Fehler könnte es auch sein, das Delphi bzw. der Provider selbst meckert. Es handelt sich bei ID um ein Pflichtfeld.

Abhilfe: Schreibe aus der Anwendung heraus irgendeinen Murks in das ID Feld (z.B. 0) oder deklariere das AutoInc-Feld als 'Optional'. Ich glaube, das heißt "Required"...
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
borwin

Registriert seit: 14. Sep 2006
Ort: Rostock
72 Beiträge
 
Delphi 2007 Enterprise
 
#5

AW: Verständnisfrage Autoinc bei Firebird

  Alt 26. Dez 2010, 14:08
Hallo,

Dein Problem liegt nicht in der Datenbank. Sowie Du es schilders ist dort alles i.o. Der Trigger könnte nocht optimiert werden .siehe
hierzu die Antwort von Thomas.
Dein Problem liegt bei Delphi, denke ich. Du hast die Felder im Datatset aus der Tabelle generieren lassen. Dabei wurde erkannt, dass das Feld ID NOT NULL ist.
Jetzt wird schon vor dem Speichern in die DB die Bedingung geprüft. Schau mal in den Propertys von dem Feld nach. Ich glaube Required muss auf False stehen.

Schöne Weihnachten

BORWIN
  Mit Zitat antworten Zitat
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.643 Beiträge
 
Delphi 12 Athens
 
#6

AW: Verständnisfrage Autoinc bei Firebird

  Alt 26. Dez 2010, 14:16
Hallo,

Jetzt wird schon vor dem Speichern in die DB die Bedingung geprüft. Schau mal in den Propertys von dem Feld nach. Ich glaube Required muss auf False stehen.

BORWIN
Ja, das wars. Vielen Dank.
Mal sehen, was ich noch am Trigger ändern kann. Werde die Daten übendrüber mal testen. Dann kommt vielleicht der Timestamp gleich mit.
Matthias
Es ist nie falsch das Richtige zu tun!
- Mark Twain
  Mit Zitat antworten Zitat
ThomasBab

Registriert seit: 7. Mai 2007
Ort: Hallenberg
57 Beiträge
 
FreePascal / Lazarus
 
#7

AW: Verständnisfrage Autoinc bei Firebird

  Alt 26. Dez 2010, 14:22
1. ID würde ich als bigint definieren, könnte sonst knapp werden.
Nun ja. Mir haben 2 Mrd immer gereicht. Was speicherst Du denn? Alle Bakterien dieser Welt?
Hallo!

Naja, 2 Mrd könnte schon knapp werden, denn ich nehme einen Generator für alle IDs in allen Tabellen der Datenbank (bin ja faul).

Und da reichen mir 2 Mrd auf keinen Fall (z.B. meine Flugdatenbank
- www.sparflugplan.com
, die regelmäßige Updates der Flugdaten erfährt), da eine einmal vergebene ID ja "verbrannt" ist, d.h. nicht mehr vergeben wird.

Außerdem tut es nicht weh, wenn ich für die IDs einen größeren Datentyp wähle, wie gesagt, ich bin faul.

Gruß
Thomas
Thomas
  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 19:03 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