Delphi - TQuery - ID z antoinc po insert
Pomocou TQuery pridám SQL príkazom do tabuľky nejaký záznam. V tabuľke je stĺpec autoinc. Dá sa nejakým príkazom zistiť naposledy pridelená hodnota autoinc?
Mám na mysli obdobu PHP príkazu pre MySQL: mysql_insert_id()
Akú databázu používaš?
Nestačilo by niečo ako select max(stlpec_autoinc)?
V MS SQL je tuším funkcia SCOPE_IDENTITY() ktorá vracia poslednú hodnotu vygenerovanú po príkaze insert...
Štandardný Paradox 7 myslím.
Pokud pres BDE, tak se zkus podivat na nejake API funkce DBIneco. jejich popis je v helpu k BDE
Ale uz z toho, ze chces k necemu zjistovat max. hodnotu AutoInc mi to zavani spatnym navrhem DB. K cemu to potrebujes?
Pouzivat AutoInc na vazby mezi tabulkami neni moc vhodne...
Povedzme, že máš nejaké meno a po jeho pridaní sa v tabuľke vytvorí záznam, kde sa v dvoch stĺpcoch bude nachádzať jeho ID a to samotné meno. To ID je autoinc a je použité na prepojenie s inou tabuľkou. Síce robím hlavne s MySQL a PHP, ale tam autoincrement je na prepojenie tabuliek použitý takmer vždy. Aký má potom autoinc význam, ak sa nemá používať? Potom by som to videl jedine na mazanie záznamov podľa jedinečného autoinc ID.
Edit: Možno by si mohol napísať nejaký článok o návrhu databáz s ohľadom na autoinc. Ja viem len to čo ma naučila prax.
Autoinc pouzivam v pripade, kdy potrebuju nejaky jedinecny index. Ale jakmile to chci na propojeni tabulek, uz si vytvarim vlastni ID.
v okamziku, kdybys chtel takove tabulky zpracovavat - sehravat, importovat apod. uz budes mit problem, protoze to budes muset osetrovat rucne - nezustava ti zachovane propojeni hlavicka-polozky
Myslím, že rozumiem. Budem vedieť do budúcna. Toto je program v Delphi, ktorý som robil takmer pred 5 rokmi, keď som sa učil SQL a na to, že som vtedy vedel o SQL len to čo ma naučila knižka Vreckový sprievodca SQL (bol tam dosť kvalitne popísaný aj návrh databázy), či ako sa to volalo, tak som s tým nadmieru spokojný. Samozrejme dosť mi radili aj tu na poradni. Teraz už nemá význam ten program meniť (dnes by som ho napísal určite lepšie).
Ale keď sa tak zamýšľam nad tým, čo si napísal, tak ručne to musím ošetrovať aj vtedy, ak by som si vytvoril vlastné ID, pretože v prípade importu by mohlo ID byť duplicitné, takže asi celkom nerozumiem.
Priklad:
mam 2 tabulky - hlavicku a radky, ktere jsou provazane pres ID
mam 2 sady takovych tabulek, ktere potrebuju sloucit.
Pak musim vzit hlavicku, zapamatovat si puvodni ID, pridat hlavicku, zjistit nove ID, vybrat radky podle puvodniho ID a zapsat radky s novym ID a takto to opakovat pro vsechny hlavicky a souvisejici radky
Pokud budu mit vlastni ID, jsem schopny jednoduse si zjistit jednoduchym dotazem, zda nedojde k duplicitam.
Pokud budu dopredu vedet, ze budu importovat data, zajistim si predem, aby ID byly na lokalitach odlisne.
Pokud to nebudu vedet, muzu je opet hromadne jednoduchym updatem zmenit (napr. pricist 100000) a pak tabulky najednou naimportovat.
Rozdil:
autoinc se prideluje v cilove tabulce, takze to musis osetrovat pri zapisu do tabulky
vlastni ID si ridim sam a vlozeni zaznamu do tabulky mi nic samo nemeni.
Jinak posledni autoincrement muzes zjistit SQL dotazem, pripadne pres BDE API
Asi bych si napsal funkci, ktere bych predal tabulku, pole a ona by vratila MAX hodnotu z toho pole.
Pak ji muzes jednoduse zavolat i pri vkladani radku k te sve hlavicce
Tak je to asi najjednoduchšie. Asi to aj tak spravím.
A ďakujem za vysvetlenie v príklade. Vyzerá to zaujímavo a do budúcnosti budem takéto možnosti zvažovať.