Doplnenie primarneho kluca do existujucej tabulky

29 views
Skip to first unread message

Peter Turčan

unread,
Feb 19, 2021, 1:21:24 PM2/19/21
to Firebird (CZ)
Ahojte,
potrebujem nejako napravit zle navrhnutu tabulku tak, ze doplnim stlpec ID, co je v pohode, ale na ten chcem zavesit generator. len neviem ako existujuce zaznamy updatnem inkrementalne o 1? da sa to vobec sql skriptom spravit?

generator potom by som nastavil napr. od 10000 aby sa to nepobilo.
dakujem za rady
Peter

Wolda

unread,
Feb 21, 2021, 5:13:34 AM2/21/21
to Firebird (CZ)
Zpatra me napada "hack":                                                                                                                                                                                                                
0) pridat novy sloupec id
1) pridat tabulce before-update trigger, ktery, je-li id zaznamu NULLove, nahradi ho zavolanim generatoru
2) UPDATE table SET id = NULL
3) deaktivovat/zrusit trigger z <1>

Mozna vsak existuje elegantnejsi reseni ( firebird jsem aktivne nepouzil 5+ let).

Honza

Jiří Činčura

unread,
Feb 21, 2021, 2:20:50 PM2/21/21
to fireb...@googlegroups.com
> 3) deaktivovat/zrusit trigger z <1>

Ten trigger bych tam asi nechal. ;)

--
Mgr. Jiří Činčura
https://www.tabsoverspaces.com/

respektive

unread,
Feb 22, 2021, 3:21:35 AM2/22/21
to Firebird (CZ)
Ahoj
pridas sloupecek,
zavolas:
update TABULKA set ID = next value for SEQ_TABULKA_ID;

vytvoris si before insert trigger kde das natvrdo
new.id = next value for SEQ_TABULKA_ID;   
varianut s prednastavenym ID bych uplne zakazal - id ma jit vzdy z generatoru

Hoj Tom

Dne neděle 21. února 2021 v 20:20:50 UTC+1 uživatel ji...@cincura.net napsal:

mjsoft

unread,
Feb 22, 2021, 3:32:34 AM2/22/21
to fireb...@googlegroups.com

Ahoj,

 

zkus toto:

 

UPDATE tabulka SET

  ID = gen_id(gen_novygenerator,1)

  WHERE ID is null;

 

Jindra

--
Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny „Firebird (CZ)“ ve Skupinách Google.
Chcete-li zrušit odběr skupiny a přestat dostávat e‑maily ze skupiny, zašlete e-mail na adresu firebird_cz...@googlegroups.com.
Chcete-li tuto diskusi zobrazit na webu, navštivte https://groups.google.com/d/msgid/firebird_cz/70e77c02-3428-476a-9c10-65e8830d8269n%40googlegroups.com.

Radomir Muras

unread,
Feb 22, 2021, 6:04:21 AM2/22/21
to fireb...@googlegroups.com
Zdravím .
Zvolil bych reseni pres preoceduru, která ma daleko sirsi moznosti..
A to neco takoveho:

create or alter procedure SetToDocsNewIDx  -- tabulka se jmenuje Docs
as
declare variable PKSloups VarChar(500); -- PKSloupce= Slp1||Sp2||... Slpn urcujici unikatnost řádku v tab.
begin
  For Select PKSloupce From docs InTo :PKSloupce -- Order By PKSloupce
    do Begin
     update docs set IDx = (Select max(IDx) From Docs) + 1;
      Where PKSloupce = :PKSloupce;  -- zvýšení o jednicku dostane jen řádek splnujici unikastnost
      -- pojede-li to pres generator pak hrozi nebezpeci výzxnamove duplicity - vícero shodných řádků bude mit ruzna ID
      -- predpokladam, ze ve stavajici tab. existují jiz sloupce jednoznacne indikujici kazdy řádek - stavajici PK...
     suspend;
  End
end;
Samozrejme prvnim krokem je doplneni sloupce IDx a jeho update na cislo "0";

Hezký den a pohodu všem.

R. Muras.

po 22. 2. 2021 v 9:32 odesílatel mjsoft <mjs...@mjsoft.cz> napsal:

Peter Turčan

unread,
Feb 22, 2021, 6:21:50 AM2/22/21
to Firebird (CZ)
chlapi dakujem vsetkym za moznosti a rady. vyskusam ich, som zvedavy, ze ako sa mi to nakoniec podari 
Peter

Dátum: pondelok 22. februára 2021, čas: 12:04:21 UTC+1, odosielateľ: mur...@gmail.com

Jiří Činčura

unread,
Feb 22, 2021, 6:56:28 AM2/22/21
to fireb...@googlegroups.com
> Zvolil bych reseni pres preoceduru, která ma daleko sirsi moznosti..
> A to neco takoveho:
>
> create or alter procedure SetToDocsNewIDx -- tabulka se jmenuje Docs

Kdyz uz nic jineho, pouzil bych RDB$DB_KEY do WHERE podminky. Ale i tak tahle verze procedury neni zrovna nejrychlejsi (a nejbezpecnejsi).
Reply all
Reply to author
Forward
0 new messages