[MySQL] 0 value in auto-increment column

Pagina: 1
Acties:
  • 360 views sinds 30-01-2008
  • Reageer

  • WouZz
  • Registratie: Mei 2000
  • Niet online

WouZz

Elvis is alive!

Topicstarter
Ik heb dus een probleem met 0 waardes in auto-increment columns. Voor mijn website gebruik in een eigen gemaakt sessie systeem welke een cookie plaatst met een SessionID welke wordt ingevoerd in de database. Aan deze SessionID is een UserID gekoppeld. Voor ingelogde gebruikers is dit natuurlijk hun UserID, maar voor niet ingelogde gebruikers gebruik ik UserID 0.

Mijn tabellen zien er ongeveer zo uit:
tabel sessions:
code:
1
2
3
4
5
SessionID VARCHAR(32) NOT NULL,
UserID    INT(6) DEFAULT '0' NOT NULL,
Agent     VARCHAR(100) NULL,
LastVisit INT(10) NULL,
PRIMARY KEY (UserID)

tabel users:
code:
1
2
3
4
5
6
ID    INT(6) NOT NULL AUTO_INCREMENT,
Level     INT(1) DEFAULT '1' NOT NULL,
Name    VARCHAR(25) NOT NULL,
Password  VARCHAR(32) NOT NULL,
enz..
PRIMARY KEY (ID)

Als een bezoeker welke al een SessionID heeft mijn site bezoekt haal ik alle sessie en gebruikers info op met één query:
code:
1
2
3
4
5
6
7
8
9
10
11
12
SELECT
    u.Name,
    u.ID,
    u.Level,
    s.LastVisit,
    s.Agent
FROM
    users AS u,
    sessions AS s
WHERE
    s.SessionID = '$SessionID' AND
    u.ID = s.UserID

Om deze query ook resultaat op te laten leveren bij niet ingelogde gebuikers heb ik dus een user met ID 0 aangemaakt. Hier ligt dus het probleem. Als ik namelijk m'n tabel wijzig ofzo wordt deze ID omgezet naar de eerstvolgende auto-increment waarde. Dus user met ID 0 pleite en mn query werkt niet meer.

Nu kan ik dit natuurlijk wel oplossen door bv. niet ingelogde gebruikers ID 1 te geven. Of bijvoorbeeld eerst de session info ophalen en vervolgens met PHP checken of het een inlogde gebruiker is en dan de user info ophalen met een volgende query. Maar ik wil het liefst alles i.v.m. performance met één query ophalen. En ik begrijp wel dat een 0 waarde niet echt in een auto-increment column hoort, maar ik vind het 'logischer' om voor niet ingelogde gebruikers ID 0 te gebruiken dan bv. ID 1. Aan een niet ingelogde gebruiker is namelijk in principe geen gebruiker toe te wijzen, 'dus' user ID 0.

Mijn vraag: hoe voorkom ik dat mn userid 0 'verspringt' naar de eerst volgende auto-increment waarde? Of moet ik gewoon het idee laten vallen dat niet ingelogde gebruikers ID 0 hebben? Of hoe doen jullie het?

On track


  • momania
  • Registratie: Mei 2000
  • Laatst online: 09-09 17:26

momania

iPhone 30! Bam!

Je id is een primaiy key én auto increment..
De auto increment, zorgt er dus iig voor dat het automatisch opgehoogd wordt, maar dan nog.
Al had je iets waarmee je die 'nul' wel kon invoeren, blijft id nog steeds je primairy key (dwz, hij moet uniek zijn, dus twee users met id 'nul' zal dan ook al nooit lukken.)

Waarom maakt je niet een field extra in je tabel waarin je aangeeft of een user is ingelogd? Dat lijkt mij iig een stuk makkelijker, daarbij blijf je dan ook je id gebruiken waar het voor bedoeld is: record id, en niets anders dus.
8-)

Neem je whisky mee, is het te weinig... *zucht*


  • WouZz
  • Registratie: Mei 2000
  • Niet online

WouZz

Elvis is alive!

Topicstarter
Op dinsdag 23 april 2002 12:14 schreef momania het volgende:
Al had je iets waarmee je die 'nul' wel kon invoeren, blijft id nog steeds je primairy key (dwz, hij moet uniek zijn, dus twee users met id 'nul' zal dan ook al nooit lukken.)

Waarom maakt je niet een field extra in je tabel waarin je aangeeft of een user is ingelogd? Dat lijkt mij iig een stuk makkelijker, daarbij blijf je dan ook je id gebruiken waar het voor bedoeld is: record id, en niets anders dus.
8-)
Ten eerste: een INSERT in de users tabel met waarde 0 lukt inderdaad niet. Hier wordt gewoon de eerst volgende auto-increment waarde voor gebruikt. Maar met een UPDATE kan je deze auto-increment waarde vervolgens wel wijzigen naar 0. Het feit dat dit in eerste instantie al niet lukt betekent voor mij dat het dus ook niet echt 'netjes' is.

Ten tweede: Volgens mij begrijp jij mijn systeem niet helemaal. Iedere bezoeker krijgt een SessionID met UserID 0. Pas als ze ingelogd zijn wordt deze UserID geupdate naar de UserID van de gebruiker. Zo kan een gebruiker dus op meerdere sessions ingelogd zijn en ook van 'afstand' uitloggen.

Probleem blijft dus dat ik alles het liefst met één query wil ophalen en vanwege die join dus een user met ID 0 moet hebben in mn users table.

On track


  • momania
  • Registratie: Mei 2000
  • Laatst online: 09-09 17:26

momania

iPhone 30! Bam!

Op dinsdag 23 april 2002 17:30 schreef WouZz het volgende:
Probleem blijft dus dat ik alles het liefst met één query wil ophalen en vanwege die join dus een user met ID 0 moet hebben in mn users table.
Maar dan zal je naar mijn mening nog steeds iets anders moeten verzinnen voor het userid, door daar niet het record id voor te gebruiken.
Wil je dat wel, dan betekend dat dat er maar 1 persoon tegelijk kan aanmelden en dan inloggen voordat de volgende pas kan. Anders zou je dus dubbele primairy keys proberen aan te maken en dat kan gewoonweg niet...

Neem je whisky mee, is het te weinig... *zucht*


  • WouZz
  • Registratie: Mei 2000
  • Niet online

WouZz

Elvis is alive!

Topicstarter
Volgens mij begrijp je het nog steeds niet (no offence) :)

In de users tabel staan alleen de geregistreerde gebruikers. Er wordt dus pas een user toegevoegd als iemand zich registreert.

Een nieuwe SessionID wordt alleen aangemaakt als een bezoeker de site voor het eerst bezoekt en dus nog geen SessionID heeft (of agents die geen cookies accepteren). De UserID van deze SessionID is dus automatisch 0. Pas als een gebruiker inlogt wordt deze omgezet in zijn UserID. Verder worden SessionID's aangemaakt met md5(uniqid(rand())). 'Dubbele' SessionID's kunnen niet voorkomen omdat dit veld tevens de primary key is.

Bdw, iedere bezoeker/agent krijgt dus een SessionID. Dit o.a. i.v.m. preferences waarvoor je niet ingelogd hoeft te zijn.

Het probleem met de 0 value in een auto-increment column heb ik trouwens ook in m'n images tabel. Bij nieuwsposts kan ik namelijk één of geen ImageID opgeven. Om de nieuwspost+image info met één query op te halen gebruik ik dus ook weer een dergelijke join zoals ik ook de user+session info ophaal. Maar om deze query ook te laten slagen als ik geen ImageID heb opgegeven (dus ImageID in het die news entry staat op 0) heb ik dus ook een image met ID 0 nodig. En deze ID is dus ook auto-increment -> same problem.

On track


  • WouZz
  • Registratie: Mei 2000
  • Niet online

WouZz

Elvis is alive!

Topicstarter
Niemand anders dan momania die hier iets op heeft toe te voegen? :?

On track


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 20:58

Janoz

Moderator Devschuur®

!litemod

Je probleem is neem ik aan dat je in je tabel geen record met ID=0 kunt zetten omdat zodra je eraan komt het ID wordt veranderd. Misschien is het een idee om je query iets aan te passen en gebruik te maken van een left join. Hierdoor worden, zodra userID in session 0 is geen bijpassent record gevonden, en dus alle velden die je uit user haalt gewoon null (itt wat nu gebeurt, namelijk het helemaal niet terug krijgen van een resultaat)

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • RedRose
  • Registratie: Juni 2001
  • Niet online

RedRose

Icebear

Aan de hand van dit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
SELECT
    u.Name,
    u.ID,
    u.Level,
    s.LastVisit,
    s.Agent
FROM
    users AS u,
    sessions AS s
WHERE
    s.SessionID = '$SessionID' AND
    u.ID = s.UserID

dit:
PHP:
1
<?if (!mysql_num_rows($theResult)) {   /*user unknown, guest user, user not logged on, bla and act accordingly*/}else {  /*user known, logged in do actions*/}?>

Sundown Circus


  • WouZz
  • Registratie: Mei 2000
  • Niet online

WouZz

Elvis is alive!

Topicstarter
Janoz:
Ja, dat is inderdaad mijn probleem :) Over die left join: Dat is inderdaad wat ik nodig heb! Thanx man! Ik zal me nu dan ff wat meer verdiepen in joins, want ik dacht dat deze manier slechts een andere vorm van notatie voor een left join was.. :o

RedRose:
Ik wil dus wel altijd een resultaat hebben want ik sla in mn session nog wat dingen op die ik nodig heb zoals laatste bezoek en voorkeuren.

On track


  • WouZz
  • Registratie: Mei 2000
  • Niet online

WouZz

Elvis is alive!

Topicstarter
http://www.sqlcourse2.com/joins.html
SELECT customer_info.firstname, customer_info.lastname, purchases.item
FROM customer_info, purchases
WHERE customer_info.customer_number = purchases.customer_number;

This particular "Join" is known as an "Inner Join" or "Equijoin". This is the most common type of "Join" that you will see or use
Hmmz.. andere notatie voor een Inner Join dus.. :D

On track


  • RedRose
  • Registratie: Juni 2001
  • Niet online

RedRose

Icebear

Op donderdag 25 april 2002 14:42 schreef WouZz het volgende:

RedRose:
Ik wil dus wel altijd een resultaat hebben want ik sla in mn session nog wat dingen op die ik nodig heb zoals laatste bezoek en voorkeuren.
Als er iemand voor het eerst inlogt of niet is aangemeld of een guest is, hoe kan je dan een laatste bezoek en voorkeuren hebben?

Dan kan je toch 'default' values maken voor iedereen die niet is ingelogd?

/edit: ok cookie ik zie t al. maak dan van u.ID 1 een 'guest'-account ipv. u.ID=0. Inner joins gaan niet werken, tenzij je een extra kolom SessionID aanmaakt in je users table.

Sundown Circus


  • WouZz
  • Registratie: Mei 2000
  • Niet online

WouZz

Elvis is alive!

Topicstarter
Woohee! Het is gelukt met de volgende query:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT
    s.Agent,
    s.Voorkeuren enzo,
    s.LastVisit,
    u.ID,
    u.Name,
    u.Level
FROM
    sessions AS s
LEFT JOIN
    users AS u ON s.UserID=u.ID
WHERE 
    s.ID = '$SessionID';

Het werkt nu helemaal okay zonder een user met ID 0! :9

En RedRose: Er zijn inderdaad 'default' values voor bezoekers die nog geen cookie met een SessionID hebben. En voorkeuren sla ik dus op in de sessie en (nog) niet in het gebruikersprofiel. Zo hoefen bezoekers zich niet te registreren (en inloggen) om hun voorkeuren aan te passen.

On track


  • RedRose
  • Registratie: Juni 2001
  • Niet online

RedRose

Icebear

Ah ok... u.ID is s.UserID... |:(

/edit: need more coffee

Sundown Circus

Pagina: 1