Avatar billede fhansen Praktikant
16. april 2008 - 09:57 Der 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;   

Finn
Avatar billede hrc Mester
16. april 2008 - 11:11 #1
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)
Avatar billede fhansen Praktikant
16. april 2008 - 13:11 #2
Problemmet med huller i rækkefølgen er at der kan skabes en mistillid
Jeg kan da godt se ideen i dit forslag, og vil afprøve det i aften.

Finn
Avatar billede arne_v Ekspert
17. april 2008 - 01:55 #3
Den SP skal mindst op på transaction isolation level repeatable read for at være sikker.
Avatar billede hrc Mester
17. april 2008 - 08:45 #4
.. Åhh ja. Du har ret. Der skal en form for mutex-agtig transaktionsstyring. Hvis det er et flerbrugerprogram.

Hvad så med at bruge auto-inc felter og logge det annullerede id når du ruller noget tilbage? Er det så ikke den letteste løsning?
Avatar billede hrc Mester
17. april 2008 - 08:47 #5
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.
Avatar billede fhansen Praktikant
18. april 2008 - 22:08 #6
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.

Finn
Avatar billede arne_v Ekspert
18. april 2008 - 23:30 #7
Det er dokumenteret:
  http://dev.mysql.com/doc/refman/5.0/en/innodb-auto-increment-handling.html

Begrundelsen er at det forbedrer performance.
Avatar billede fhansen Praktikant
19. april 2008 - 00:21 #8
Ahhh,  ja det kan jeg se..*S*
Så er jeg tilbage ved enten at bruge hrc's forslag, eller prøve en løsning med max()
Avatar billede arne_v Ekspert
19. april 2008 - 02:56 #9
MAX+1 kræver isolation transaction level serializable og er derfor langsommere end
hrc's løsning (som kun kræver repeatable read).
Avatar billede fhansen Praktikant
19. april 2008 - 11:26 #10
udemærket, når vi taler langsom, hvor meget taler vi så om, der bliver vel oprettet 40 - 50 lejekontrakter om året.

Måske jeg kunne lave en tabel ala hrc's, der indeholder værdien for andre dokumenter, så som fakturaer og lign.
Avatar billede arne_v Ekspert
19. april 2008 - 15:32 #11
Så er performance jo bedøvende ligegyldigt.

Hvis du skal oprette 40000-50000 i minuttet så betyder transaction isolation level noget.
Avatar billede fhansen Praktikant
19. april 2008 - 23:56 #12
Takker for al jeres hjælp.

Ligger i ikke nogle svar.
Avatar billede hrc Mester
20. april 2008 - 13:03 #13
Jeg lægger et her.
Avatar billede fhansen Praktikant
20. april 2008 - 20:40 #14
Kan jeg dele point mellem jer, da i begge jo har hjulpet mig meget ??
Avatar billede arne_v Ekspert
21. april 2008 - 02:06 #15
det kan godt lade sig gøre

bare marker begge navne i combo boxen inden du klikker accepter
Avatar billede fhansen Praktikant
22. april 2008 - 21:17 #16
Håber det er ok med jer begge 2, tak for hjælpen
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester