AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

AutoIncrement mit FireBird

Ein Thema von Marco Steinebach · begonnen am 15. Apr 2021 · letzter Beitrag vom 15. Jul 2021
Antwort Antwort
Seite 1 von 2  1 2   
Marco Steinebach

Registriert seit: 4. Aug 2006
481 Beiträge
 
Delphi 5 Enterprise
 
#1

AutoIncrement mit FireBird

  Alt 15. Apr 2021, 20:33
Datenbank: FireBird • Version: 3.0 • Zugriff über: IBDAC
Hallo zusammen,
Ich möchte gern in FB eine Tabelle erstellen, bei der das Feld "ID", welches auch zur eindeutigen Identifikation dient, bei jedem Insert automatisch hochgezählt wird.
Ich hab das Ganze zwar in Delphi gelöst, aber es muss doch, um Himmelswillen, auch irgendwie in der Datenbank zu verankern sein???
Ich hab schon viel über Generatoren und co gelesen, aber ich kapiere nicht, wo die hin müssen, und, tja, eigentlich kapiere ich das ganze Zeug nicht.
Kann mir da bitte mal jemand helfen?
Also ich träume von
Code:
CREATE TABLE 'TEST' (ID NOT NULL PRIMARY KEY AUTO_InCREMENT'
...
Sprich, wenn ich dann ein Insert oder Append absätze, brauche ich mich um die ID nicht mehr kümmern.
Und nu?

Für eure Antworten bedanke ich mich schonmal ganz herzlich.
Wandogau
Marco Steinebach
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
1.558 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: AutoIncrement mit FireBird

  Alt 15. Apr 2021, 20:45
Ja, du brauchst einen Generator für sowas.
Was benutzt du denn um die DB zu verwalten?
IBExpert?
Dort gibt's glaube ich einen Baumknoten dafür.
  Mit Zitat antworten Zitat
Marco Steinebach

Registriert seit: 4. Aug 2006
481 Beiträge
 
Delphi 5 Enterprise
 
#3

AW: AutoIncrement mit FireBird

  Alt 15. Apr 2021, 20:49
*lächel, bis jetzt nix.
Ein schlichtes
[code]
CREATE DATABASE TEST
{/code]
und das war's, bis jetzt.
Können solche Generatoren via SQL angelegt werden, oder wie?
Und wo kommt dann deren Aufruf hin?
Ich würde, furchtbar gern, alles, was angelegt werden muss mit meinem Programm selbst erledigen.

Herzlich grüßt
Wandogau
Marco Steinebach
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.009 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: AutoIncrement mit FireBird

  Alt 15. Apr 2021, 21:26
Es gibt einige Beispiel hier in der DP für einen Generator.
Vllt hilf dir das hier schon weiter => https://www.delphipraxis.net/1355130-post13.html
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
1.744 Beiträge
 
Delphi 7 Professional
 
#5

AW: AutoIncrement mit FireBird

  Alt 15. Apr 2021, 21:31
Das erste Suchergebnis meiner Suchmaschine liefert für "firebird autoincrement" passende Statements mit ausführlicher Erläuterung.

How to create an autoincrement column?
  Mit Zitat antworten Zitat
Benutzerbild von Olli73
Olli73

Registriert seit: 25. Apr 2008
Ort: Neunkirchen
469 Beiträge
 
#6

AW: AutoIncrement mit FireBird

  Alt 15. Apr 2021, 23:08
Bei Firebird 3 kann man sich das mit dem Generator und dem Trigger automatisieren lassen:

https://stackoverflow.com/questions/...ebird-database
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
4.763 Beiträge
 
Delphi 10.1 Berlin Professional
 
#7

AW: AutoIncrement mit FireBird

  Alt 16. Apr 2021, 07:32
Moin...
Zitat:
*lächel, bis jetzt nix.
...dann wird es aber Zeit. https://dbeaver.io/
Zitat:
Ich würde, furchtbar gern, alles, was angelegt werden muss mit meinem Programm selbst erledigen.
-1 Halte ich für schlecht. Früher habe ich auch so gedacht. Aber...DB Admistration ist Sache des DB Tools.
Begründung:
1. DB Sicherung und Wiederherstellung. Wenn du eine "ältere" DB wiederherstellen mußt, dann müßtest du das Programm laufen lassen um wieder den gleichen Meta Stand zu haben.
2. Du kannst keine Differenzscripte erstellen
3. Die DB sollte ihre "Version" kennen um dann Differenzscripte auszuführen zu können. (Tabelle "_Version" o.ä.)
4. Übersicht über die Änderungen (siehe Bild)

Beispiel:
Du hast eine DB mit Version 500 als Datensicherung. Die aktuelle DB hat aber 502...dann läßt du die Scripte für 501 und 502 nacheinader ausführen...fertsch.
Code:
Zitat:
Können solche Generatoren via SQL angelegt werden, oder wie?
ja...wie schon gesagt.
Zitat:
Und wo kommt dann deren Aufruf hin?
Ausführung des SQL mit den entspechenden Anweisungen
Miniaturansicht angehängter Grafiken
patch.jpg  

Geändert von haentschman (16. Apr 2021 um 07:39 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von IBExpert
IBExpert

Registriert seit: 15. Mär 2005
517 Beiträge
 
FreePascal / Lazarus
 
#8

AW: AutoIncrement mit FireBird

  Alt 16. Apr 2021, 08:56
es gibt durchaus Kunden, die so was erfolgreich machen und in Ihrer Exe jeden Versionstand der db
einfach mit verteilen.

Ich mach das nicht, weil bei mir eine exe auch unterschiedliche Datenbankstände
bedienen kann, aber bei wem das Projekt immer eine 1zu1 Beziehung zwischen Datenbank und exe hat, der
kann in seiner exe ja einfach alle db sql definitionen durchnummerieren und in der db dann einfach
speichern, welcher Befehlsummer in dieser db zuletzt ausgeführt wurde und wenn eine neue exe kommt,
dann alle sql befehle auf dieser db ausführt, die noch erforderlich sind, um den neuesten Datenbankstand
zu erzeugen.

Wenn du sehen willst, welche Befehle gebraucht werden, um eine komplette firebird datenbank anzulegen, lade
dir zum Beispiel ibexpert auch als personal herunter und schau da in die db1_30.sql datei an, die dort für die
demo db mit kopiert wird ( da ist fast alles drin, was man in fb30 machen kann).

Deine Aufgabe wäre dann nur noch, das Script in Teile aufzuteilen, die deine Komponenten dann step by step
ausführen können und die dann entsprechend der o.a. Liste in deine exe aufzunehmen und die jeweils ausgeführte
dann als datenbankstand in der db zu speichern, damit beim nächsten Start der exe das nicht noch mal passiert.
Ob du die sql Befehle dann jeweils einfach als String konstanten mit passender benennung reinkompilierst
oder einfach als externe Textdatei zur exe auslieferst bleibt dir überlassen (es kann aber durchaus
komplexer werden als du auf den ersten blick denkst, weil wenn du ein objekt änder willst, das
von anderen benutzt wird, musst du ggf erst mal alle abhängigen objekte ändern oder sogar löschen
und ggf programmierst du dann deinen eigenen ibexpert nach, der so was sowieso schon kann.

auf der seite ddl siehst du in ibexpert auch alle befehle, die erforderlich sind, um das jeweilige
Datenbankobjekt zu erzeugen, das sieht dann zB so aus



Code:
/******************************************************************************/
/****              Generated by IBExpert 16.04.2021 08:46:47               ****/
/******************************************************************************/

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



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


CREATE GENERATOR ID;

CREATE TABLE ORDERS (
    ID          NUMERIC(18,0) NOT NULL,
    ORDERDATE   DATE NOT NULL,
    CUSTOMER_ID NUMERIC(18,0),
    NETAMOUNT   NUMERIC(12,2) NOT NULL,
    TAX         NUMERIC(12,2) NOT NULL,
    TOTALAMOUNT NUMERIC(12,2) NOT NULL
);



/******************************************************************************/
/****                             Primary keys                            ****/
/******************************************************************************/

ALTER TABLE ORDERS ADD CONSTRAINT PK_ORDERS PRIMARY KEY (ID);


/******************************************************************************/
/****                             Foreign keys                            ****/
/******************************************************************************/

ALTER TABLE ORDERS ADD CONSTRAINT FK_CUSTOMERID_1 FOREIGN KEY (CUSTOMER_ID) REFERENCES CUSTOMER (ID) ON DELETE CASCADE;


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

CREATE DESCENDING INDEX ORDERS_IDX1 ON ORDERS (ORDERDATE);


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



SET TERM ^ ;



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



/* Trigger: ORDERS_BI0 */
CREATE OR ALTER TRIGGER ORDERS_BI0 FOR ORDERS
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
    if (new.id is null) then
    new.id = gen_id(id, 1);
END
^
SET TERM ; ^



/******************************************************************************/
/****                              Privileges                             ****/
/******************************************************************************/
Holger Klemt
www.ibexpert.com - IBExpert GmbH
Oldenburger Str 233 - 26203 Wardenburg - Germany
IBExpert and Firebird Power Workshops jederzeit auch als Firmenschulung
  Mit Zitat antworten Zitat
Marco Steinebach

Registriert seit: 4. Aug 2006
481 Beiträge
 
Delphi 5 Enterprise
 
#9

AW: AutoIncrement mit FireBird

  Alt 17. Apr 2021, 21:06
Hallo zusammen,
Erstmal ganz herzlichen Dank an alle für die Antworten. Meine Güte, , ich glaube, ich muss mal meine Suchmaschine reparieren, die Links, die bei euch gleich oben standen, hat google mir nicht ausgespuckt - oder es war schon zu spät nachts.
Jedenfalls hab ich's jetzt verstanden.

Aber trotzdem nochmal eine blöde Frage:
Ich hab noch nicht wirklich verstanden, warum ich die DB nicht mit meinem Programm erstellen soll, gut, wenn ich gleich eine DB mit ausliefere, die toll ist, wird mein Quell-Code natürlich entsprechend kleiner, weil die ganzen Befehle da nicht drin sind, soweit so klar.
Mein Kunde hat also Version 1.5 meines Programms, und version 1.5 der passenden Datenbank.
Wo kommt die überhaupt hin, eine Tabelle für sowas?
Jetzt gibt es die Version 1.6.
Dafür müsste, die Datenbank 1.5 des Kunden, einige Änderungen machen, die aber, so sagt ihr, nicht mein Programm macht...
Sondern wer?
Also auf deutsch, V1.5 hat bei den Adressen noch keinen Spitznamen, die V1.6 schon.
Ich hätte jetzt einfach in mein Programm ein Alter Table gemacht, falls es die Spalte "spitzname" nicht gibt.
Wie macht ihr das?

Ich bin echt gespannt und grüße herzlich
Wandogau
Marco Steinebach
  Mit Zitat antworten Zitat
Benutzerbild von IBExpert
IBExpert

Registriert seit: 15. Mär 2005
517 Beiträge
 
FreePascal / Lazarus
 
#10

AW: AutoIncrement mit FireBird

  Alt 18. Apr 2021, 09:34
da spricht generell nichts dagegen, aber was machst du wenn es im netzwerk mehrere User gibt? Die haben aus welchen Gründen auch immer verschiedene Versionsstände der exe.
soll deine exe dann einfach mal versuchen, das Feld anzulegen, auch wenn es schon existiert?
Probematischer wird es schon wenn es eine Tabelle zB mit allen Felder schon gibt, du aber warum auch immer einen Datentyp für ein Feld ändern willst ...

Wenn netzwerk und verschiedene exe bei dir gar kein Problem ist, dann kannst du das auch ignorieren, aber die Architektur am Anfang
hat schon so manchen Programmierer später fluchen lassen, als die Anwendung komplexer wurde, die Ansprüche der Anwender höher wurden und man auf einmal mehrere Kunden dafür hatte ....

Das deine exe bei Bedarf einfach alter table auf die bestehende Datenbank macht ist bei einer nicht im Netzwerk eingesetzen Datenbank selten ein Problem, im Netzwerk kann aber schon
ein eigentlich simpler neuer Index bei falscher Transaktionseinstellung problematisch sein, weil ein unique mit parallelen Inserts nicht so banal zu handeln ist (Firebird kann das,
aber ob du dann weisst, wie man das mit Firebird macht, ohne einen Datenbankshutdown zu machen, wirst du ggf später erkennen ....)

Und deine Frage ist keineswegs blöd, so wie du das verstaden hast, kannst du das ohne Einschränkung machen. Solange wir nicht wissen, welches Einsatzszenario deine Software hat,
werden viele von uns sicherlich Lösungen für Probleme schildern, die du ggf gar nichts haben wirst. Vielleicht wirst du dich aber auch früher, als du denkst, ärgern, das du da
den simplen weg gegangen bist.
Holger Klemt
www.ibexpert.com - IBExpert GmbH
Oldenburger Str 233 - 26203 Wardenburg - Germany
IBExpert and Firebird Power Workshops jederzeit auch als Firmenschulung
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 +2. Es ist jetzt 06:47 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf