Results 1 to 8 of 8

Thread: Firebird 3; sequences

  1. #1
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,520

    Firebird 3; sequences

    Ik ben met een klein project bezig. Daar wil ik een firebird database volledig in code maken. Maar ik heb een vraag over de sequences en primary key.

    In FB 2.5 maak ik gebruik van generators. Elk tabel heeft zijn eigen generator voor de primary key. De trigger zorgt daarvoor dat de primary key netjes wordt opgehoogd.

    In FB 3 zijn generators vervangen door sequences. Als je nu een met create table een tabel aanmaakt met identity, maakt FB3 zelf een sequence aan om de primary key na voor insert deze te vullen met het getal gegenereerd uit de sequence. Werkt prima.

    Nu heb ik een tweede tabel. Als ik daar ook gebruik maak van identity, wordt dezelfde sequence gebruikt. Dat is, naar mijn weten niet de bedoeling.

    Hoe ga ik in FB3 vertellen dat elke tabel zijn eigen sequence teller heeft?

    SQL Code:
    1. CREATE TABLE objects (
    2. id integer generated BY DEFAULT AS identity PRIMARY KEY,
    3. name varchar(15)
    4. );
    Het lijkt mij dat 'default vervangen moet worden door een andere sequence.
    Delphi is great. Lazarus is more powerfull

  2. #2
    In FB 3 werken de generators ook nog.

    Voor de 'generated by' is het dit:
    SQL Code:
    1. <column definition> ::=
    2.         <name> <type> GENERATED BY DEFAULT AS IDENTITY [ (START WITH <value>) ]<constraints>
    Dus DEFAULT is onderdeel van het statement en moet je niet wijzigen.

    Ik denk dat er voor <name> automatisch een sequence gemaakt wordt.
    An identity column is a column associated with an internal sequence generator. Its value is set automatically when the column is omitted in an INSERT statement.
    Heb je dan dus geen trigger meer nodig? Neat

    (Ik zit alleen nog met teveel installaties op FB2.x)

    Quote Originally Posted by jkuiper View Post
    Nu heb ik een tweede tabel. Als ik daar ook gebruik maak van identity, wordt dezelfde sequence gebruikt. Dat is, naar mijn weten niet de bedoeling.
    Heb je dit gecontroleerd?
    En waarom zou het een probleem zijn?
    Die sequence loopt gewoon door dus is altijd uniek.

  3. #3
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,520
    Ja. bij de eerste test merkte ik dat het eerste nummer niet met 1 begon, maar met 2. Dat vond ik raar. Ik zag ook dat er maar 1 sequence wordt aangemaakt.
    Maar bij de tweede test gaat het wel goed. Ik ga toch even verder experimenteren.
    In FB 3 werken de generators ook nog.
    Dat lijkt mij ook logisch als je een backup van 2.5 terugleest naar FB3.
    Ik maak gebruik van DBWorkbench 5 en daar zie ik op de linker tabel geen generators meer staan.
    Delphi is great. Lazarus is more powerfull

  4. #4
    GENERATOR en SEQUENCE zijn ook hetzelfde. Je kunt volgens mij in FB 3 die termen ook door elkaar gebruiken (wat natuurlijk niet te adviseren is).
    Intern wordt het nog wel opgeslagen in RDB$GENERATORS dacht ik

  5. #5
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,520
    Even verder getest. Als ik in code een volledige database aanmaak met tabellen en gebruik maak van de default identyfier, wordt er GEEN sequence aangemaakt (waarom DBWorkbench dat wel doet, is mij een raadsel). Er is inderdaad nu een 'echte' interne generator gemaakt zoals in MySQL en PostgreSQL
    Delphi is great. Lazarus is more powerfull

  6. #6
    Ja, ze zeggen ook dat identity een "internal sequence generator" is dus ik kan me voorstellen dat ie niet zichtbaar is.

    Dat betekent wel dat je dan ook met "INSERT ... RETURNING" moet werken om de ingevoegde waarde terug te krijgen want GENID() heeft dan ook geen zin.
    Tevens zou je met INSERT op dat veld met identity per ongeluk zelf een waarde voor de internal sequence op kunnen geven. Dat kan leiden tot duplicate values.

    In FB 4 komen ze met een GENERATED ALWAYS i.p.v. een GENERATED BY DEFAULT. Die GENERATED ALWAYS zou dan voor een eventuele overschrijving van een eigen opgegeven waarde moeten zorgen (zodat je nooit meer zelf een eigen waarde in kunt voegen).

    Of die default identifier nu per veld geldt of er één gebruikt wordt voor heel de database maakt op zich niet zoveel uit zolang die maar uniek is. Wel zou de START WITH x dan natuurlijk geen zin hebben. Dus ik vermoed dat er toch per veld een eigen interne identifier bijgehouden wordt.

  7. #7
    Senior Member EricLang's Avatar
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,211
    Ik gebruik de sequence zelf altijd *zonder* trigger. Dit voor het geval je client-side de key nodig hebt (en vaak is dat het geval) voordat e.e.a. de database ingaat.

  8. #8
    Ja, dat doe ik op een paar plaatsen ook.
    Dat omdat IBX vroeger nog geen mogelijkheid had om INSERT ... RETURNING goed te verwerken (en dat was in FB 1.5.ook nog geen optie).

    Maar dan nog is het goed dat de database wel triggers heeft zodat je ook wel eens een 'gewone' insert kunt doen zonder de key op te geven (of die als null door te geven).

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •