16. april 2008 - 09:57Der er
14 kommentarer og 2 løsninger
værdi af autoinc felt i en MySql
Hey.
Jeg har en Mysql tabel, hvori jeg har et autoinc felt. Dette flet ville jeg gerne bruge til fortløbende nummer på lejekontrakter. Problemmet er at hvis oprettelsen bliver anulleret, så er værdien af autoinc. feltet opdateret, således at der vil mangle en lejekontrakt i rækkefølgen. Kan jeg komme uden om dette ?? Eller skal jeg lave et felt, hvortil jeg finder værdien med max(). Mit koden er skrevet således
MyConnection1.StartTransaction; //...ændring eller update af data. MyQuery.ApplyUpdates; //... lejekontrakt preview //... Hvis lejekontrakten accepteres, kaldes MyConnection1.Commit; Myquery.CommitUpdates; //... Lejekontrakten udskrives //... Hvis lejekontrakten ikke accepteres, kaldes MyQuery.RestoreUpdates; MyConnection1.Rollback;
Er det et problem at der er huller i rækkefølgen? Er det ikke bare kosmetik?
Hvis nu det er vigtigt kan du lave en nummerserietabel hvori din tæller ligger og vha. en storedprocedure eller lignende rekvirere et nyt nummer. Ved rollback burde den værdi blive sat tilbage automatisk
create table nummerserie ( navn char(10) not null, vaerdi int default 0 not null, primary key(navn) );
I din stored procedure - hvis du vælger det:
create procedure GetKey @navn char(20), @vaerdi int = 0 output as declare @current_vaerdi int select @current_vaerdi = vaerdi from nummerserie where (navn = @navn) if not @current_vaerdi is null begin set @vaerdi = @current_vaerdi + 1 update nummerserie set vaerdi = @vaerdi where (navn = @navn) end else set @vaerdi = 0
(hvis syntaksen ikke dur så er det fordi jeg arbejder på en MSSQL-database)
På den måde vil du kunne dokumentere en ubrudt række af id'er. En tredje løsning er at skrive recorden uanset hvad, men sætte et flag der indikerer at den er annulleret.
Jeg synes det er pudsigt at autoinc feltet ikke bliver rollback'et, på linie med de andre felter. Jeg bruger jo Transaction, som jo en forudsætning for rollback.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.