Firebird ID/COUNTER Problem

Forum für neue Firebird-Anwender.

Moderator: thorben.braun

Harry_7771
Beiträge: 9
Registriert: Fr 26. Aug 2022, 13:33

Hallo allerseits, ich bin ein absoluter Anfänger, also verzeiht mir etwaige Fehler, falls ich etwas falsch ausdrücke oder nicht gleich verstehe. :)

Ich stehe vor folgendem Problem: Ich möchte in einem Table Daten eintragen, hierfür verwende ich die Insert Into Methode. 

INSERT INTO the_table (tag)
VALUES (22);

Sobald ich den Befehl ausführen möchte, kommt folgende Fehlermeldung. 


The insert failed because a column definition includes validation constraints.Validation error for column "the_table".COUNTER, value "*** zero ***".

Mein Ziel wäre es, dass ich Daten in den Table einfügen kann und der "COUNTER" automatisch abgerufen und gesetzt wird.

Hier sind (hoffentlich) noch ein paar dienliche Informationen:

Metadata der Spalte vom Table: CREATE TABLE THE_TABLE (
COUNTER Integer NOT NULL, PRIMARY KEY (COUNTER) ) ;

Der Generator der die Zahl des Counters beinhaltet:

CREATE GENERATOR DATABASE_IDENT;
SET GENERATOR DATABASE_IDENT TO 48.

Und der Trigger von der Spalte "COUNTER" (steht unter dem Punkt AutoIncrement):

CREATE TRIGGER TR_GEN_DATA_ID FOR THE_TABLE
ACTIVE
BEFORE INSERT
POSITION 0
AS
BEGIN
IF (NEW.COUNTER IS NULL) THEN
NEW.COUNTER=GEN_ID(GEN_DATA_ID,1);
END.

Nochmals möchte ich mich vorab für Fehler in der Formulierung entschuldigen, ich bin blutiger Anfänger und gerade dabei zu lernen. :)

Danke im Voraus!
jhoehne
Beiträge: 39
Registriert: Di 11. Dez 2018, 09:19

Wo passiert denn das Einfügen? In einem DB-Tool wie IBExpert oder FlameRobin oder programmatisch?

Die Meldung sieht für mich aus wie die Fehlermeldung, die eine Datenbankzugriffskomponente (in Delphi: FireDAC, UniDAC, etc) ausgibt. Dieser muss man explizit mitteilen, dass ein Trigger die Spalte verwaltet, sonst wird da ein Fehler ausgegeben noch bevor die Komponente den INSERT überhaupt versucht.
--
Joachim
bfuerchau
Beiträge: 485
Registriert: Mo 7. Mai 2018, 18:09
Kontaktdaten:

Nur eine als Identity definierte Spalte füllt sich automatisch.
Ansonsten musst du den Generator mit "next value for GeneratorName" auslesen und beim Insert in der Spalte angeben.

https://www.firebirdnews.org/firebird-s ... ns-in-3-0/
Zuletzt geändert von bfuerchau am Mo 29. Aug 2022, 09:09, insgesamt 1-mal geändert.
Harry_7771
Beiträge: 9
Registriert: Fr 26. Aug 2022, 13:33

Hallo zusammen,

danke vorab für die Antworten.

Ich gebe den Code in SQL Editor von Firebird SQL Studio ein.

Was ich noch sagen kann, dass es sich um eine Firebird 2.5 Version handelt.
Harry_7771
Beiträge: 9
Registriert: Fr 26. Aug 2022, 13:33

bfuerchau hat geschrieben: Fr 26. Aug 2022, 21:53 Nur eine als Identity definierte Spalte füllt sich automatisch.
Ansonsten musst du den Generator mit "next value from GeneratorName" auslesen und beim Insert in der Spalte angeben.

https://www.firebirdnews.org/firebird-s ... ns-in-3-0/
Wie genau würde der Code mit Insert Into aussehen? LG und Danke :)
Harry_7771
Beiträge: 9
Registriert: Fr 26. Aug 2022, 13:33

jhoehne hat geschrieben: Fr 26. Aug 2022, 17:50 Wo passiert denn das Einfügen? In einem DB-Tool wie IBExpert oder FlameRobin oder programmatisch?

Die Meldung sieht für mich aus wie die Fehlermeldung, die eine Datenbankzugriffskomponente (in Delphi: FireDAC, UniDAC, etc) ausgibt. Dieser muss man explizit mitteilen, dass ein Trigger die Spalte verwaltet, sonst wird da ein Fehler ausgegeben noch bevor die Komponente den INSERT überhaupt versucht.
Ich gebe den Code in SQL Editor von Firebird SQL Studio ein.
bfuerchau
Beiträge: 485
Registriert: Mo 7. Mai 2018, 18:09
Kontaktdaten:

insert into mytable(id, fx, ...)
values(next value for <sequence>, <Inhalt>, ...)

https://firebirdsql.org/refdocs/langref ... uefor.html
Harry_7771
Beiträge: 9
Registriert: Fr 26. Aug 2022, 13:33

bfuerchau hat geschrieben: Mo 29. Aug 2022, 09:08 insert into mytable(id, fx, ...)
values(next value for <sequence>, <Inhalt>, ...)

https://firebirdsql.org/refdocs/langref ... uefor.html
Der Code wird akzeptiert, auch den Counter setzt er um eine Zahl nach oben "CREATE GENERATOR DATABASE_IDENT;
SET GENERATOR DATABASE_IDENT TO 48."

Jedoch fügt er nichts in den Table ein, sprich ich gebe ein :

insert into MY_TABLE (COUNTER, TAG)
values(next value for DATABASE_IDENT, 10);

Dann setzt er die Zahl vom Generator DATABASE_IDENT um einen hoch, aber er fügt nichts in den Table ein.

Need Help :D
Gerd
Beiträge: 234
Registriert: Di 1. Okt 2019, 17:13

Hallo in die Runde.

Ich arbeite unter Linux und ich kenne 'Firebird SQL Studio' nicht.

Denke, dass da noch ein COMMIT notwendig ist. Eventuell auch eine angestoßene Aktualisierung der Tabelle (Grid).

Möglichkeiten:
:: Nach dem INSERT-Statement "COMMIT;" eingeben und ausführen.

:: Das Programm könnte im SQL-Editor einen Schalter für COMMIT (ROLLBACK) haben.

:: Das Programm könnte in seinen Grundeinstellungen die sinng. Option AUTO-COMMIT anbieten - und sie ist derzeit deaktiviert.



Viele Grüße
Gerd
Linux Mint 21.3 Virginia Cinnamon 6.0.4
Firebird 5.0.0., Embedded, ISQL: LI-V5.0.0.1306
Lazarus 3.0.0 - FPC 3.2.2
Harry_7771
Beiträge: 9
Registriert: Fr 26. Aug 2022, 13:33

Gerd hat geschrieben: Mo 29. Aug 2022, 13:26 Hallo in die Runde.

Ich arbeite unter Linux und ich kenne 'Firebird SQL Studio' nicht.

Denke, dass da noch ein COMMIT notwendig ist. Eventuell auch eine angestoßene Aktualisierung der Tabelle (Grid).

Möglichkeiten:
:: Nach dem INSERT-Statement "COMMIT;" eingeben und ausführen.

:: Das Programm könnte im SQL-Editor einen Schalter für COMMIT (ROLLBACK) haben.

:: Das Programm könnte in seinen Grundeinstellungen die sinng. Option AUTO-COMMIT anbieten - und sie ist derzeit deaktiviert.



Viele Grüße
Gerd

Nach vielen Wochen hast du mich gerettet :), jetzt funktioniert alles, habe die AUTO-COMMIT Funktion eingeschaltet. Vielen Vielen Dank!

Eine Frage hätte ich noch, wenn ich bei Java einen SQL Befehl eingebe, müsste er dann so aussehen "INSERT INTO COMMIT the_table (........)" ?
Antworten