Kom ihåg mig?
Home Menu

Menu


Först lediga Id i mySQL

 
 
Ämnesverktyg Visningsalternativ
Gammal 2010-12-18, 16:23 #1
aelanders avatar
aelander aelander är inte uppkopplad
Medlem
 
Reg.datum: Dec 2004
Inlägg: 146
aelander aelander är inte uppkopplad
Medlem
aelanders avatar
 
Reg.datum: Dec 2004
Inlägg: 146
Standard Först lediga Id i mySQL

En tabell med ett Id enligt

CREATE TABLE MinTabell (
Id bigint unsigned NOT NULL AUTO_INCREMENT,
...
...


Efterhand har vissa poster raderats och det blir "hål" i följden av Id:en
Låt säga att Id ser ut så sorterade asc.
1
2
3
4
5
6
11
12
13
14
...
...
...

Finns det någon sql-sats som leter upp första lediga Id, i detta fall Id = 7 ?

Dessutom vill jag har svar på hur stort "hålet" är, dvs hur många oanvända Id det finns
iföljd från och med 7. I detta fall 4 st ( 7,8,9,10 )?


Två tillfällen som jag vill använda detta.
a. När en ny post ska läggas till så ska första lediga Id användas.
b. "Packa" ihop posterna så att alla "hål" försvinner.


på Serverversion: 5.0.51b så letar denna SQL-sats upp första lediga Id
select Id+1 as lastId from MinTabell where (select count(*) from MinTabell where Id = lastId) = 0 limit 1


Server version: 5.0.75
Server version: 5.1.42
Server version: 5.1.50
får jag
ERROR 1054 (42S22): Unknown column 'lastId' in 'where clause'


Varför göra detta nu då? Jo det kan man ju fråga sig.
Varför ska osten skäras på ett visst sätt? Varför ska ljusen på bordet så i exakta rader? osv
Fobier kanske ...

Har det någon betydelse ur effektivitetssynpunkt?
Kan tillägga att en tabell för närvarande innehåller drygt 68 milj poster.
aelander är inte uppkopplad   Svara med citatSvara med citat
Gammal 2010-12-18, 16:38 #2
MMCs avatar
MMC MMC är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jan 2008
Inlägg: 560
MMC MMC är inte uppkopplad
Mycket flitig postare
MMCs avatar
 
Reg.datum: Jan 2008
Inlägg: 560
Återanvänd inte id:n. Vad händer om det finns kvar referenser i andra tabeller till den gamla raden?

Unsigned bigint har maxvärde 18446744073709551615 så du har mao ett tag kvar innan du behöver oroa dig för att få slut på dem

Om du nödvändigtvis någon gång vill bli av med "hålen" så föreslår jag en export av datan + en import utan att importera id-kolumnen, med en återställd auto_increment-räknare. På så sätt får alla rader nya id:n från 1 och uppåt. Men att göra det är nog snarare lätt neurotiskt än effektivitetsbefrämjande
MMC är inte uppkopplad   Svara med citatSvara med citat
Gammal 2010-12-18, 17:39 #3
aelanders avatar
aelander aelander är inte uppkopplad
Medlem
 
Reg.datum: Dec 2004
Inlägg: 146
aelander aelander är inte uppkopplad
Medlem
aelanders avatar
 
Reg.datum: Dec 2004
Inlägg: 146
Citat:
Ursprungligen postat av MMC Visa inlägg
Återanvänd inte id:n. Vad händer om det finns kvar referenser i andra tabeller till den gamla raden?

Unsigned bigint har maxvärde 18446744073709551615 så du har mao ett tag kvar innan du behöver oroa dig för att få slut på dem
Just i det specifika fallet så finns inga referenser från andra tabeller till Id:et och kommer aldirg att finnas heller.

Men dina ord är nog kloka ändå. Jag får försöka komma över mina "städfobier" :-)
aelander är inte uppkopplad   Svara med citatSvara med citat
Gammal 2010-12-18, 16:53 #4
emilvs avatar
emilv emilv är inte uppkopplad
Bara ett inlägg till!
 
Reg.datum: Feb 2004
Inlägg: 1 564
emilv emilv är inte uppkopplad
Bara ett inlägg till!
emilvs avatar
 
Reg.datum: Feb 2004
Inlägg: 1 564
Nej, det har ingen som helst betydelse ur effektivitetssynpunkt. Enda gången det skulle kunna påverka effektiviteten är om datatypen tar slut så du måste välja en större datatyp, till exempel använda BIGINT istället för INT. Då krävs mer RAM för att hålla indexet i minnet och det tar större plats på disk (båda två saker som kan påverka prestandan).

Men så länge du bara har hål och långt kvar till "taket" verkar det bara trassligt att "täppa igen" hålen. Som MMC säger ställer det till med problem om du har andra tabeller som relaterar till den du jobbar med nu. Tänk om du har gamla data kvar som då plötsligt ofrivilligt kopplas till den här tabellen? Eller om du har externa tjänster som också använder id-numret. Om du till exempel tagit bort en webbsida så kanske det är bättre att besökaren får veta det än att de kommer till en helt ny sida.
emilv är inte uppkopplad   Svara med citatSvara med citat
Gammal 2010-12-18, 19:26 #5
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Generellt bör man vara försiktig med att använda autoincrement om det finns en naturlig primärnycken man kan använda i stället. Det är viktigt att man tänker igenom hur man definierar primärnyckel i varje tabell.

Jag skulle aldrig ge mig in på att "återanvända" första lediga nyckel just i en autoincrement PK. när man använder naturliga primärnycklar kan man göra det får då finns värdet definierat utanför systemet.

Syftet med autoincrement är att kunna använda en PK där inga naturliga nycklar skulle passa, exempelvis för ordernummer, fakturanummer m.m.
Conny Westh är inte uppkopplad   Svara med citatSvara med citat
Gammal 2010-12-21, 12:42 #6
pelmereds avatar
pelmered pelmered är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: May 2010
Inlägg: 1 342
pelmered pelmered är inte uppkopplad
Har WN som tidsfördriv
pelmereds avatar
 
Reg.datum: May 2010
Inlägg: 1 342
Citat:
Ursprungligen postat av ConnyWesth Visa inlägg
Generellt bör man vara försiktig med att använda autoincrement om det finns en naturlig primärnycken man kan använda i stället. Det är viktigt att man tänker igenom hur man definierar primärnyckel i varje tabell.

Syftet med autoincrement är att kunna använda en PK där inga naturliga nycklar skulle passa, exempelvis för ordernummer, fakturanummer m.m.
Där håller jag inte riktigt med.
Jag tycker det är bra att ha en autoincrement primärnyckel så ofta som möjligt. Jag tycker det är en bra struktur när man alltid kan referera till en rad med tabell.id. Om man ska naturliga primärnycklar så blir det oftast strängar och då blir indexen gigantiska(och därmed långsamma) i många fall när man har stora tabeller.

Ordernummer och fakturanummer tycker jag är bra exempel på tillfällen då man inte ska använda autoincrement utan här borde varje ID slumpas fram av säkerhetsskäl.
pelmered är inte uppkopplad   Svara med citatSvara med citat
Gammal 2010-12-21, 13:25 #7
emilvs avatar
emilv emilv är inte uppkopplad
Bara ett inlägg till!
 
Reg.datum: Feb 2004
Inlägg: 1 564
emilv emilv är inte uppkopplad
Bara ett inlägg till!
emilvs avatar
 
Reg.datum: Feb 2004
Inlägg: 1 564
Citat:
Ursprungligen postat av ITisGood.se Visa inlägg
Ordernummer och fakturanummer tycker jag är bra exempel på tillfällen då man inte ska använda autoincrement utan här borde varje ID slumpas fram av säkerhetsskäl.
Det är väl ett bokföringsbrott att slumpa fram fakturanummer?

I övrigt håller jag med dig om att tekniska heltalsnycklar är bra för att få ner indexstorleken, men de är trots allt inte alltid att föredra. Det beror ju mycket på tabellen och så också. För små tabeller finns det ju liten eller ingen anledning att använda annat än naturliga primärnycklar.
emilv är inte uppkopplad   Svara med citatSvara med citat
Gammal 2010-12-21, 15:17 #8
pelmereds avatar
pelmered pelmered är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: May 2010
Inlägg: 1 342
pelmered pelmered är inte uppkopplad
Har WN som tidsfördriv
pelmereds avatar
 
Reg.datum: May 2010
Inlägg: 1 342
Ja, i exemplet med landskoder är det ju såklart en bra idé att använda landskoden som primärnyckeln.
Men jag har sett system där man t.ex. använder person-/organisationsnummer som primärnycken och sparar dessa med strecket som en stäng, dvs 000000-0000. Det ger väldigt dåliga index tycker jag även om det är ett "bra" naturligt index.

Citat:
Ursprungligen postat av emilv Visa inlägg
Det är väl ett bokföringsbrott att slumpa fram fakturanummer?
Är det verkligen så?
Jag vill inte skicka ut fakturor med ett autoincrementnummer som fakturanummer. Då kan ju alla se exakt hur många fakturor man skickar ut under en viss tidsperiod och det ser jag som en företagshemlighet...
Men det kanske bara gäller i bokföringen så man kan skriva ett annat referensnummer på fakturan man skickar ut?
pelmered är inte uppkopplad   Svara med citatSvara med citat
Gammal 2010-12-21, 16:23 #9
emilvs avatar
emilv emilv är inte uppkopplad
Bara ett inlägg till!
 
Reg.datum: Feb 2004
Inlägg: 1 564
emilv emilv är inte uppkopplad
Bara ett inlägg till!
emilvs avatar
 
Reg.datum: Feb 2004
Inlägg: 1 564
Citat:
Ursprungligen postat av ITisGood.se Visa inlägg
Är det verkligen så?
Jag vill inte skicka ut fakturor med ett autoincrementnummer som fakturanummer. Då kan ju alla se exakt hur många fakturor man skickar ut under en viss tidsperiod och det ser jag som en företagshemlighet...
Men det kanske bara gäller i bokföringen så man kan skriva ett annat referensnummer på fakturan man skickar ut?
http://www.wn.se/showthread.php?p=20341439
http://www.skatteverket.se/rattsinfo...800028340.html
emilv är inte uppkopplad   Svara med citatSvara med citat
Gammal 2010-12-21, 16:35 #10
tartareandesire tartareandesire är inte uppkopplad
Supermoderator
 
Reg.datum: Jan 2004
Inlägg: 11 585
tartareandesire tartareandesire är inte uppkopplad
Supermoderator
 
Reg.datum: Jan 2004
Inlägg: 11 585
Citat:
Ursprungligen postat av ITisGood.se Visa inlägg
Ja, i exemplet med landskoder är det ju såklart en bra idé att använda landskoden som primärnyckeln.
Men jag har sett system där man t.ex. använder person-/organisationsnummer som primärnycken och sparar dessa med strecket som en stäng, dvs 000000-0000. Det ger väldigt dåliga index tycker jag även om det är ett "bra" naturligt index.



Är det verkligen så?
Jag vill inte skicka ut fakturor med ett autoincrementnummer som fakturanummer. Då kan ju alla se exakt hur många fakturor man skickar ut under en viss tidsperiod och det ser jag som en företagshemlighet...
Men det kanske bara gäller i bokföringen så man kan skriva ett annat referensnummer på fakturan man skickar ut?
Jag ser det som en tämligen värdelös företagshemlighet Hur som helst så går det bra att använda andra system än 1-2-3-4 osv. så länge det finns en löpande korrekt serie utan avbrott. Se lagtexten.
__________________
Full-stack developer, free for smaller assignments
tartareandesire är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 2 (0 medlemmar och 2 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 13:05.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
 
Copyright © 2017