Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Power Designer12: auto increment polje u tabeli za InterBase

[es] :: Firebird/Interbase :: Power Designer12: auto increment polje u tabeli za InterBase

[ Pregleda: 4959 | Odgovora: 15 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

tokajac

Član broj: 93240
Poruke: 123
89.216.113.*



+5 Profil

icon Power Designer12: auto increment polje u tabeli za InterBase14.01.2008. u 12:59 - pre 197 meseci
U PD12 pravim Conceptual i Physical Data Model, koji prevodim u sql skript za InterBase.

Interesuje me kako da primarni kljuc tabele (jedna kolona) postavim da bude auto increment?
Koji je postupak insert-a u tu tabelu?

Npr.

tabela: Voce;
kolone: voceID, vrsta, boja, tezina;

hocu da mi voceID bude auto increment tj. 1, 2, 3.... (jel ima ogranicenja? ja ne bih)


Predpostavljam da onda kod inserta izostavljam prvu kolonu:

INSERT INTO Voce VALUES( 'banane', 'zuta', 10 );
Jel tachan upit?


Hvala unapred i pozdrav!




 
Odgovor na temu

tokajac

Član broj: 93240
Poruke: 123
89.216.113.*



+5 Profil

icon Re: Power Designer12: auto increment polje u tabeli za InterBase14.01.2008. u 13:45 - pre 197 meseci
Josh jedno pitanje:

Sta se dogadja sa tabelama koje 'vuku' kljuc iz table ciji se primarni kljuc auto incrementuje (za sve slucajeve Dependencyja)
 
Odgovor na temu

savkic
Igor Savkić

Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Power Designer12: auto increment polje u tabeli za InterBase14.01.2008. u 15:37 - pre 197 meseci
> U PD12 pravim Conceptual i Physical Data Model, koji prevodim u sql skript za InterBase.

> Interesuje me kako da primarni kljuc tabele (jedna kolona) postavim da bude auto increment?
> Koji je postupak insert-a u tu tabelu?

IB nema autoincrement polje, mogu se koristiti generatori tj. sekvence za dobijanje primarnog ključa. Pogledaj CREATE GENERATOR u IB uputstvu.

> Predpostavljam da onda kod inserta izostavljam prvu kolonu:
> INSERT INTO Voce VALUES( 'banane', 'zuta', 10 );

To rešenje zahteva postojanje before insert triggera koji će obezbediti vrednost za primarni ključ. Često je u aplikaciji potrebno znati ID unetog sloga, tako da se to rešava na strani klijenta tako što se prvo zatraži vrednost IDa a potom doda slog u bazu.

> Sta se dogadja sa tabelama koje 'vuku' kljuc iz table ciji se primarni kljuc auto incrementuje (za sve slucajeve Dependencyja)

Ne shvatam.
 
Odgovor na temu

tokajac

Član broj: 93240
Poruke: 123
89.216.113.*



+5 Profil

icon Re: Power Designer12: auto increment polje u tabeli za InterBase14.01.2008. u 16:00 - pre 197 meseci
Hvala na odgovoru! Isprobacu.

Kol'ko mi se chini za Interbase-ov slucaj je izgleda najjednostavnije SELECTOM uzeti najvecu vrednost u tabeli i uvecati je za jedan.

> Sta se dogadja sa tabelama koje 'vuku' kljuc iz table ciji se primarni kljuc auto incrementuje (za sve slucajeve Dependencyja)

Kada izmedju dve tabele postoji veza (One to one, One to many, Many to Many...)
primarni kljuc ce biti u drugoj tabeli Foreign Key. Da li ima neki bitan side-effect?
Nisam jos radio sa autoincrementom, pa intuitivno razmisljam. Svaka korisna informacija unapred, moze da mi ustedi dosta vremena.


Pozdrav!


 
Odgovor na temu

savkic
Igor Savkić

Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Power Designer12: auto increment polje u tabeli za InterBase14.01.2008. u 23:12 - pre 197 meseci
> Kol'ko mi se chini za Interbase-ov slucaj je izgleda najjednostavnije SELECTOM uzeti najvecu vrednost u tabeli i uvecati je za jedan.

Nikako, osim ako ne želiš da upucaš samog sebe u nogu :) Zamisli da dva klijenta zatraže tu vrednost istovremeno, dobiće se isti ID. Koristi generatore, tome služe.

> Sta se dogadja sa tabelama koje 'vuku' kljuc iz table ciji se primarni kljuc auto incrementuje (za sve slucajeve Dependencyja)

> Kada izmedju dve tabele postoji veza (One to one, One to many, Many to Many...)
> primarni kljuc ce biti u drugoj tabeli Foreign Key. Da li ima neki bitan side-effect?

Prvo se mora uneti master key, tj. dobiti ID za master record a tek onda unositi child slogove na osnovu MasterID, dakle nema tu prečica ni skrivenih mogućnosti. MasterID možeš dobiti na klijentu preko SELECT GEN_ID(NazivGeneratora, 1), uneti master slog i potom uneti child slogove.
BTW. verovatno znaš ali da spomenem, neće da škodi, postoji i Firebird koji sa IB deli zajedničkog pretka tako da imaju dosta sličnosti. Osnovna razlika je u tome što je FB open source.


 
Odgovor na temu

tokajac

Član broj: 93240
Poruke: 123
89.216.113.*



+5 Profil

icon Re: Power Designer12: auto increment polje u tabeli za InterBase15.01.2008. u 01:15 - pre 197 meseci
Odradio sam u Query Browseru:
Code:

CREATE GENERATOR putnikid

pa onda,
Code:
 SELECT GEN_ID(putnikid,1) FROM putnici 



To bi bilo upravo ono sto mi treba.

Interesuje me josh kako to da se generator ne vezuje za jednu konkretnu tabelu nego je na nivou baze?!
Dakle, nista me ne sprecava da korisitm ISTI generator za putnike, avione, letove...
Da li je moguce vezati GENERATOR za tabelu? Kako se on pravi?

Iz ovoga sam skontao da cu za svaku tabelu napraviti po jedan generator i insertovati.
Da li sam na navedeni nachin omogucio bezbedan unos?
Pretpostavljam da za vrednost kolone treba da se stavi INTEGER? Sta ako hocu BASH PUNO n-torki da unesem (treba da se izgenerisem i posle upishem br koji je veci od opsega integera)? Jel moze LONG?

Jel moze primer za trigger za insert? Trazim po netu, ali sam u zurbi.


Pozdrav!


 
Odgovor na temu

schild
Dejan Šild
TopCode Software
Subotica

Član broj: 59888
Poruke: 138
77.46.228.*

Sajt: www.topcode.rs


+2 Profil

icon Re: Power Designer12: auto increment polje u tabeli za InterBase15.01.2008. u 06:23 - pre 197 meseci
Citat:
tokajac:
Interesuje me josh kako to da se generator ne vezuje za jednu konkretnu tabelu nego je na nivou baze?!
Dakle, nista me ne sprecava da korisitm ISTI generator za putnike, avione, letove...
Da li je moguce vezati GENERATOR za tabelu? Kako se on pravi?

Iz ovoga sam skontao da cu za svaku tabelu napraviti po jedan generator i insertovati.
Sam si odgovorio!
Citat:
Da li sam na navedeni nachin omogucio bezbedan unos?
Pretpostavljam da za vrednost kolone treba da se stavi INTEGER? Sta ako hocu BASH PUNO n-torki da unesem (treba da se izgenerisem i posle upishem br koji je veci od opsega integera)? Jel moze LONG?
Jel moze primer za trigger za insert? Trazim po netu, ali sam u zurbi.

Pozdrav!

Postoji BIGINT u Firebirdu (od v1.5), ne znam da li se u IB bas tako zove, i od koje verzije ga ima.

Primer za trigger:
Code:
create or alter trigger partneri_bi for partneri
active before insert position 0
as
begin
  if (new.sifpartnera is null) then
    new.sifpartnera = gen_id(gen_partneri_id,1);
end
Ali obrati pažnju da ćeš na ovaj način imatu "rupe" u rednim brojevima ako budeš radio Insert, pa onda zbog nečega uradiš Rollback transakcije - GENERATOR ostaje uvećan!
Ovo je u principu dobro rešenje za ID polje neke tabele (koje treba samo da je jedinstveno), ali nije za polje koje mora imati neprekinutu sekvencu (npr. Broj_fakture).
 
Odgovor na temu

savkic
Igor Savkić

Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Power Designer12: auto increment polje u tabeli za InterBase15.01.2008. u 10:42 - pre 197 meseci
> Interesuje me josh kako to da se generator ne vezuje za jednu konkretnu tabelu nego je na nivou baze?!

Generatori tako rade, tj. tako se postiže najveća fleksibilnost, može se imati jedan generator za sve tabele ili za svaku tabelu po jedan (ali se to kontroliše iz aplikacije).

> Da li je moguce vezati GENERATOR za tabelu? Kako se on pravi?

Ne, osim indirektno tako što u aplikaciji vodiš računa da ga koristiš samo za tu tabelu,

> Iz ovoga sam skontao da cu za svaku tabelu napraviti po jedan generator i insertovati.
> Da li sam na navedeni nachin omogucio bezbedan unos?

Da, generatori su van transakcione kontrole tako da bez obzira na broj istovremenih upita ili statusa transakcije (commit, rollback) generatorima se menja vrednost.

> Pretpostavljam da za vrednost kolone treba da se stavi INTEGER? Sta ako hocu BASH PUNO n-torki
> da unesem (treba da se izgenerisem i posle upishem br koji je veci od opsega integera)? Jel moze LONG?

Staviš BIGINT ili NUMERIC(18, 0), to će biti dovoljno za narednih 100 godina ;)
 
Odgovor na temu

tokajac

Član broj: 93240
Poruke: 123
89.216.113.*



+5 Profil

icon Re: Power Designer12: auto increment polje u tabeli za InterBase15.01.2008. u 23:09 - pre 197 meseci
Hvala (again) na odgovorima!


Josh 2 pitanja:


Radim sa Firebird 1.5. i InterBase konzolom

1. Gde se kreiraju triggeri (i stored procedure)?
Probao sam standardno da izvrsim skript ali se javila greska: Unexpected end of command.
U Konzoli vidim da ima
Tables
Views
Stored Procedures
External Functions
Generators
.
.
.


2. Da li navedeni trigger pojednostavljuje INSERT?

Tj.

Kreiram tabele u bazi;
Kreiram Generator(e);
Kreiram Trigger;

Da li za insert navodim kompletan upit ili izostavljam polje koje sam predvideo da popunjava Generator?

Code:

 INSERT INTO Voce VALUES( 'banane', 'zuta', 10 );




Alternativno resenje je da iz aplikacije iscitam (onda mi ne treba trigger):
Code:
 
  SELECT GEN_ID(putnikid,1) FROM putnici  


Pa to postaje primarni kljuc prilikom sledeceg upisa:

INSERT INTO Voce VALUES(11, 'banane', 'zuta', 10); -- 11 je generisano


Nesporno je da cu koristiti trigger resenje chim realizujem.


Pozdrav!



 
Odgovor na temu

savkic
Igor Savkić

Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Power Designer12: auto increment polje u tabeli za InterBase16.01.2008. u 15:59 - pre 197 meseci
> 1. Gde se kreiraju triggeri (i stored procedure)?
> Probao sam standardno da izvrsim skript ali se javila greska: Unexpected end of command.

To je namenjeno izvršavanju jedne po jedne DDL komande, ako treba čitav skript moraš koristiti posebnu execute script komandu.
Možeš pogledati i neke druge GUI alate, IBExpert, DatabaseWorkbench, IBOConsole... Ima spisak na www.ibphoenix,com.

> 2. Da li navedeni trigger pojednostavljuje INSERT?

Zavisi od potreba, ako ti ID ne treba onda može i tako, ja lično više volim da sve kontrolišem tako da uvek izričito uzimam ID.

> Da li za insert navodim kompletan upit ili izostavljam polje koje sam predvideo da popunjava Generator?

Možeš kombinovati po potrebi, s tim što trigger napišeš tako da to uzima u obzir. Na primer (pišem napamet pa verovatno ima grešaka).
IF POLJEID.NEW IS NULL then
POLJEID.NEW = GENID(Proba, 1);

Ako izostaviš POLJEID, u vreme okidanje triggera će biti NULL i dobiće ID, ako navedeš neće biti NULL i zadržaće ID iz aplikacije.

 
Odgovor na temu

tokajac

Član broj: 93240
Poruke: 123
89.216.113.*



+5 Profil

icon Re: Power Designer12: auto increment polje u tabeli za InterBase17.01.2008. u 00:59 - pre 197 meseci
Zackoljica:
Generator mi uvecava ID za vrednost 2 ili 5??!


Zar se vrednost uvecavanja ne navodi u SELECT gen_id(primer, 1) FROM tabela1-- br 1 je br uvecavanja
Ako stavim 0 ,onda se ne uvecava uopste (to je ok)

Jel uvecavanje ima neke veze sa brojem kolona u tabeli? Ili sa brojem kreiranih generatora? (nagadjam!)



INSERT odradjen tako sto na prvo mesto stavim NULL:
Code:

 INSERT INTO voce VALUES(NULL, 'banane', 'zuta', 10 );



Gde sam omanuo?


Pozdrav!
 
Odgovor na temu

savkic
Igor Savkić

Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Power Designer12: auto increment polje u tabeli za InterBase17.01.2008. u 11:23 - pre 197 meseci
> Generator mi uvecava ID za vrednost 2 ili 5??!
> Zar se vrednost uvecavanja ne navodi u SELECT gen_id(primer, 1) FROM tabela1-- br 1 je br uvecavanja

Upravo tako, ako se tebi povećava za veći broj onda ili pozivaš više puta generator ili tražiš uvećanje veće od 1.

> Jel uvecavanje ima neke veze sa brojem kolona u tabeli? Ili sa brojem kreiranih generatora? (nagadjam!)

Ne.

> INSERT odradjen tako sto na prvo mesto stavim NULL:

Najbolja praksa ti je da izostaviš vrednosti, kod ovog konkretnog primera je svejedno, međutim ako neko polje ima i default vrednost onda će se ona dodeliti samo ako je polje izostavljeno iz inserta.
 
Odgovor na temu

tokajac

Član broj: 93240
Poruke: 123
89.216.113.*



+5 Profil

icon Re: Power Designer12: auto increment polje u tabeli za InterBase21.01.2008. u 13:00 - pre 197 meseci
Nasao sam alat: EMS SQL Menager 2005 for InterBase & Firebird -preporucujem ga!
Nastelovao sam generator da funkcionishe na sledeci nachin:

napravim generator:
Code:

      CREATE GENERATOR probaid
  


napravim trigger:
Code:

     CREATE TRIGGER tabela_ciji_se_primarni_kljuc_generishe_BI FOR tabela_ciji_se_primarni_kljuc_generishe
     ACTIVE BEFORE INSERT
     POSITION 0
     AS
     BEGIN
        if (new.primarni_kljuc is null) then
          new.primarni_kljuc = gen_id(probaid,1);
     END
  


Sve funkcionishe cool!

-------------------------------------------------------------------------------------------------------
Sledece je da upisani kljuc iscitam, i koristim dalje u aplikaciji.
(trenutno mi stoji reshenje SELECT MAX(primarni_kljuc).. ,ali kao sto je u prethodnim postovima diskutovano otvara mogucnost greske)

Probao sam sa:
Code:

  SELECT GEN_ID( probaid, 1 ) FROM tabela_ciji_se_primarni_kljuc_generishe

ALI mi to vraca nekoliko uzastopnih vrednosti pocevsi od one koja bi trebalo SAMA da se pojavi(?!). To prouzrokuje pogresnu vrednost generatora prilikom sledeceg okidanja. (postovao sam ranije ovaj problem)
Jel ima efikasnog objasnjenja za ovaj scenario?

Da li je resenje:
Code:

  SELECT GEN_ID( probaid, 0 ) FROM tabela_ciji_se_primarni_kljuc_generishe


Ne bih pocinjao da "cheprkam po mraku" dok ne stignu saveti.


POSITION -cemu sluzi? Probao sam sa razlicitim vrednostima ( 0,1,2...), ali nisam primetio razlicita ponasanja. Jel se to odnosi na redni broj kolone?


Hvala puno na dosadasnjoj pomoci!


 
Odgovor na temu

savkic
Igor Savkić

Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Power Designer12: auto increment polje u tabeli za InterBase21.01.2008. u 13:41 - pre 197 meseci
> SELECT GEN_ID( probaid, 1 ) FROM tabela_ciji_se_primarni_kljuc_generishe
> SELECT GEN_ID( probaid, 0 ) FROM tabela_ciji_se_primarni_kljuc_generishe

> ALI mi to vraca nekoliko uzastopnih vrednosti pocevsi od one koja bi trebalo SAMA da se pojavi(?!). To prouzrokuje pogresnu vrednost
> generatora prilikom sledeceg okidanja. (postovao sam ranije ovaj problem)

Treba ti SELECT GEN_ID(PROBA, 1) FROM RDB$DATABASE. Štos je da se selekcija vrši iz tabele koja ima samo jedan slog, ako ih ima više, GEN_ID će se pozivati više puta.

> POSITION -cemu sluzi? Probao sam sa razlicitim vrednostima ( 0,1,2...), ali nisam primetio razlicita ponasanja. Jel se to odnosi na redni broj kolone?

Misliš na ALTER TABLE ALTER FIELD POSITION X? Označava redosled polja u tabeli, recimo kada pozoveš SELECT * FROM TABLE.
 
Odgovor na temu

galisnik
NS

Član broj: 18494
Poruke: 81
*.intens.co.yu.



Profil

icon Re: Power Designer12: auto increment polje u tabeli za InterBase12.02.2008. u 16:19 - pre 196 meseci
Citat:

POSITION -cemu sluzi? Probao sam sa razlicitim vrednostima ( 0,1,2...), ali nisam primetio razlicita ponasanja. Jel se to odnosi na redni broj kolone?


Da dopunim Savkica. Vjerovatnije je da si pitao za POSITION u CREATE TRIGGER bloku. Taj broj pored POSITION oznacava redoslijed izvrsavanja triggera, jer ti za jednu tabelu mozes imati vise triggera npr. before insert tipa (ili nekog drugog, korisno je procitati teoriju) - a tada redoslijed koji ce se prvi od njih izvrsiti naravno da moze da bude itekako vazan u programerskoj logici, pa otud i potreba za POSITION.
 
Odgovor na temu

obucina

Član broj: 38191
Poruke: 723

Jabber: obucina


+7 Profil

icon Re: Power Designer12: auto increment polje u tabeli za InterBase08.05.2008. u 23:43 - pre 193 meseci
Za Power Designer - generatori se prave u fizickom modelu. Otvoris dijalog za tabelu, udjes u properties kolone koju zelis da napravis da bude AutoInc, kartica General, stavka Sequence. Ovde kreiras ili biras generator i njegova svojstva. PD automatski pravi trigere. Radio sam Interbase bazu u Power Designer-u i odustao, jer PD baguje sa generatorima.
 
Odgovor na temu

[es] :: Firebird/Interbase :: Power Designer12: auto increment polje u tabeli za InterBase

[ Pregleda: 4959 | Odgovora: 15 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.