[SQL] Eerste vrije ID

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

  • SuperJERK
  • Registratie: Januari 2002
  • Laatst online: 30-03 16:12
Ik heb een tabel 'TEST' daarin staat 1 colum 'ID' deze bevat de volgende waardes.

1
2
3
6
7
10
13

Nu wil ik graag de eerste vrije waarde voor ID opvragen (in dit geval 4). Kan dit in MySQL zonder subselects?

  • whoami
  • Registratie: December 2000
  • Laatst online: 09:31
Waarom wil je het zo doen, en gebruik je gewoon geen auto-increment?

https://fgheysels.github.io/


  • Jaspertje
  • Registratie: September 2001
  • Laatst online: 18-03 13:46

Jaspertje

Max & Milo.. lief

select Max(id)+1

Geen idee of het werkt hoor

edit:

te laat :P

[betweter mode]
Kan je niet gewoon autoincrement doen??
[/]

[ Voor 11% gewijzigd door Jaspertje op 13-11-2003 10:59 ]


  • SuperJERK
  • Registratie: Januari 2002
  • Laatst online: 30-03 16:12
whoami schreef op 13 november 2003 @ 10:59:
Waarom wil je het zo doen, en gebruik je gewoon geen auto-increment?
Omdat ik eerder verwijderde rijen weer wil vullen.
Jaspertje schreef op 13 november 2003 @ 10:59:
select Max(id)+1

Geen idee of het werkt hoor

[edit]
te laat :P

[betweter mode]
Kan je niet gewoon autoincrement doen??
Daar komt dus 14 uit ;)

Geen autoincrement dus...

  • Jaspertje
  • Registratie: September 2001
  • Laatst online: 18-03 13:46

Jaspertje

Max & Milo.. lief

Je wilt dus nummer 4 in het voorbeeld en niet 14.... tja.. ik zou niet meer willen zeggen dan dat ik het niet echt goed vindt.

Wat je kan doen is een loop maken door alle velden en er een teller naast laten lopen.. kijken of ie gelijk is zo niet.. dan weet je dat het nummer van de teller 'vrij' is. Maar nogmaals.. dit is geen goed model als je het mij vraagt..

  • SuperJERK
  • Registratie: Januari 2002
  • Laatst online: 30-03 16:12
Jaspertje schreef op 13 november 2003 @ 11:04:
Je wilt dus nummer 4 in het voorbeeld en niet 14.... tja.. ik zou niet meer willen zeggen dan dat ik het niet echt goed vindt.

Wat je kan doen is een loop maken door alle velden en er een teller naast laten lopen.. kijken of ie gelijk is zo niet.. dan weet je dat het nummer van de teller 'vrij' is. Maar nogmaals.. dit is geen goed model als je het mij vraagt..
Deze tabel bevat ruim 30.000 records, dus het is niet echt netjes om daar allelei select statements op los te laten ;)

  • Jaspertje
  • Registratie: September 2001
  • Laatst online: 18-03 13:46

Jaspertje

Max & Milo.. lief

SuperJERK schreef op 13 november 2003 @ 11:06:
[...]


Deze tabel bevat ruim 30.000 records, dus het is niet echt netjes om daar allelei select statements op los te laten ;)
Dus kan je beter auto increment doen :)

  • SuperJERK
  • Registratie: Januari 2002
  • Laatst online: 30-03 16:12
Jaspertje schreef op 13 november 2003 @ 11:07:
[...]

Dus kan je beter auto increment doen :)
Nee, want ik wil de tussen liggende lege plaatsen nu weer opvullen...

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 09-01 11:25

D2k

waarom :?
leg dat nou eerst eens uit

Doet iets met Cloud (MS/IBM)


  • Jaspertje
  • Registratie: September 2001
  • Laatst online: 18-03 13:46

Jaspertje

Max & Milo.. lief

SuperJERK schreef op 13 november 2003 @ 11:09:
[...]


Nee, want ik wil de tussen liggende lege plaatsen nu weer opvullen...
Ik ben toch zeer nieuwsgierig waarom je tussenliggende ID's weer wilt gebruiken.. want ik kan me er weinig bij voorstellen..

Je zou ook select top 1000 kunnen doen ofzo.. kijken of je daar wat mist.. zo ja.. mooi zo nee.. de volgende 1000

Verwijderd

Je kan dit beter door middel van een sort oplossen (welke ordening probeer je aan te brengen?), ordenen op unique id is niet de bedoeling in database applicaties doorgaans.

Edit:
Echter. Als je het perce wilt; doe je dit:

Maak een tabel my_free_ids met alleen een integer, indexed.

Indien je een record verwijderd, doe een INSERT INTO my_free_ids VALUES (1234); waarbij 1234 het id van het verwijderde record is.

Indien je een nieuw record wilt aanmaken, doe een
SELECT FROM my_free_ids ORDER BY my_free_id LIMIT 1;
Dit geeft het laagste vrije id. Vervolgens doe je:
DELETE FROM my_free_ids WHERE id=(nieuwe id);
Om aan te geven dat die niet meer vrij is.

Get it?

[ Voor 64% gewijzigd door Verwijderd op 13-11-2003 11:18 ]


  • L_Jinx
  • Registratie: Augustus 2001
  • Laatst online: 30-03 15:52

L_Jinx

Oh, the humanity of it all

SuperJERK schreef op 13 november 2003 @ 11:09:
[...]


Nee, want ik wil de tussen liggende lege plaatsen nu weer opvullen...
[eigenwijs]
Waarom zou je dat willen??
Volgens mij kost je dat meer, dan dat het je ooit gaat opleveren.
[/eigenwijs]

Ik heb geen oplossing voor je maar ben wel benieuwd hoe je dit op een eenvoudige manier kan realiseren.

[ Voor 3% gewijzigd door L_Jinx op 13-11-2003 11:13 ]


  • SuperJERK
  • Registratie: Januari 2002
  • Laatst online: 30-03 16:12
D2k schreef op 13 november 2003 @ 11:10:
waarom :?
leg dat nou eerst eens uit
Heeft te maken met welke links op welke plaats komen te staan. Een link helemaal bovenaan komt op 1 te staan en de gene eronder op 2 enzo.

Nu wil ik opgeven dat een link op de eerste vrije plaats vanaf bijv. positie 4 moet komen te staan

1
2
4
5
6
8
9

In dit geval dus positie 7.

  • whoami
  • Registratie: December 2000
  • Laatst online: 09:31
Het ID - veld is gewoon een administratief veld. Gewoon een nummertje in je DB dat je intern gebruikt. 't Maakt niet uit wat dat nummertje is, dus ga je ook geen tijd verspelen in het maken van een oplossing om die ID's op te vullen en ze te bepalen.

https://fgheysels.github.io/


  • SuperJERK
  • Registratie: Januari 2002
  • Laatst online: 30-03 16:12
L_Jinx schreef op 13 november 2003 @ 11:11:
[...]

Ik heb geen oplossing voor je maar ben wel benieuwd hoe je dit op een eenvoudige manier kan realiseren.
De eenvoedigste manier is gewoon meerdere selects te doen, maar ik zou het graag mooier willen oplossen. Indien er geen andere oplossingen zijn dan doe ik het natuurlijk gewoon op die manier.

Verwijderd

Lees ff mijn post hierboven ik gaf een eenvoudige oplossing.(kost je wel een extra tabel, maar dat lijkt me in dit geval niet erg)

  • SuperJERK
  • Registratie: Januari 2002
  • Laatst online: 30-03 16:12
whoami schreef op 13 november 2003 @ 11:19:
Het ID - veld is gewoon een administratief veld. Gewoon een nummertje in je DB dat je intern gebruikt. 't Maakt niet uit wat dat nummertje is, dus ga je ook geen tijd verspelen in het maken van een oplossing om die ID's op te vullen en ze te bepalen.
Okies maak van mijn voorbeeld nu dit.

Linkid, Naam, Plaatsid

De plaats id is nu de ID die ik in het voorbeeld gaf, dus linkid is voor een aantal links.

1
2
3
6
7
8
9

Dit beter te begrijpen?

Graag ophouden over waarom geen auto_increment te gebruiken want dat is niet de oplossing ;)

  • whoami
  • Registratie: December 2000
  • Laatst online: 09:31
Nou, als jij die gaten perse wilt opvullen is dat natuurlijk jouw probleem. Hou er dan wel rekening mee dat het bepalen van een nieuw id dan zeer lang kan duren. Je zult nl. alle id's moeten overlopen totwanneer je een gaatje vind.

ID-velden zouden helemaal geen betekenis mogen hebben.

https://fgheysels.github.io/


  • SuperJERK
  • Registratie: Januari 2002
  • Laatst online: 30-03 16:12
Verwijderd schreef op 13 november 2003 @ 11:21:
Lees ff mijn post hierboven ik gaf een eenvoudige oplossing.(kost je wel een extra tabel, maar dat lijkt me in dit geval niet erg)
Dit is natuurlijk ook een oplossing, maar het gaat er mij om of er een (1) SQL statement is die dat zou kunnen doen.

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 09-01 11:25

D2k

SuperJERK schreef op 13 november 2003 @ 11:24:
[...]


Dit is natuurlijk ook een oplossing, maar het gaat er mij om of er een (1) SQL statement is die dat zou kunnen doen.
dan kan ik je uit de droom helpen: nee

Doet iets met Cloud (MS/IBM)


  • SuperJERK
  • Registratie: Januari 2002
  • Laatst online: 30-03 16:12
whoami schreef op 13 november 2003 @ 11:23:
Nou, als jij die gaten perse wilt opvullen is dat natuurlijk jouw probleem. Hou er dan wel rekening mee dat het bepalen van een nieuw id dan zeer lang kan duren. Je zult nl. alle id's moeten overlopen totwanneer je een gaatje vind.

ID-velden zouden helemaal geen betekenis mogen hebben.
Het gaat nu dus over een plaatsid, misschien is het gehele woordje id wel fout gekozen. Dus maak van plaatsid = plaats. Ik wil dus graag de eerst vrije plaats willen bepalen doormiddelvan 1 sql statement.

  • L_Jinx
  • Registratie: Augustus 2001
  • Laatst online: 30-03 15:52

L_Jinx

Oh, the humanity of it all

SuperJERK schreef op 13 november 2003 @ 11:20:
[...]


De eenvoedigste manier is gewoon meerdere selects te doen, maar ik zou het graag mooier willen oplossen. Indien er geen andere oplossingen zijn dan doe ik het natuurlijk gewoon op die manier.
Ja dat is inderdaad wel eenvoudig. Maar aangezien je aangaf dat het om 30.000 records gaat, vind ik deze oplossing eigenlijk niet eenvoudig ;)
Ik denk dat de oplossing van de tabel met vrije ID's dan toch wel het makkelijkste is.

  • whoami
  • Registratie: December 2000
  • Laatst online: 09:31
Antwoord: nee.

Tenzij je misschien een tabel aanlegt met nrs van 1 tot max(id), jouw tabel joined met deze tabel of een subquery doet en zo het laagste id uit die tabel met id's haalt die niet in je tabel voorkomt waarin je een record wilt inserten.

https://fgheysels.github.io/


  • SuperJERK
  • Registratie: Januari 2002
  • Laatst online: 30-03 16:12
D2k schreef op 13 november 2003 @ 11:25:
[...]

dan kan ik je uit de droom helpen: nee
Geen droom, alleen het zou erg mooi zijn. Met subqueries zal het wel kunnen, maar ze draaien hier MySQL (en wel een ouwere versie dan diegene die wel subqueries ondersteunen.).

Maar dit is wel een duidelijk antwoord :)

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
De implementatie van wumpus is goed bruikbaar., kost je eenmalig tijd om op een bestaande tabel te doen, daarna zijn de kosten niet zo groot meer.

Maar imo gebruik je je id op een verkeerde wijze. Waarom moet een nieuw element nou per sé in het midden van die tabel?

Tevens schept het verwarring. Ik weet niet waarvoor je het precies gebruikt, maar stel je een winkel voor... En stel dat de winkels weten dat id 50 een 'dinges' is. Dinges gaat uit het assortiment, is niet meer bestelbaar. Het eerste nieuwe product 'wattes' komt bij een volgende insert op id 50. Winkels bestellen 50 en krijgen ipv dinges, wattes.
Uiteraard enigszins overdreven voorbeeld, maar dit zijn mogelijke problemen.

edit:
Ik typ weer te traag, zie inmiddels 10 nieuwe reply's...

[ Voor 7% gewijzigd door Voutloos op 13-11-2003 11:32 ]

{signature}


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Ik ben het met de meeste reacties eens dat een autonummer een goed idee is, maar om de TS te antwoorden:

dit gaat heel goed met een zgn. tally table. Een tabel met slechts 1 kolom gevuld met nummers 1 tot en met bijvoorbeeld 10000.

code:
1
CREATE TABLE TallyTable (Number int)



Je kunt dan onderstaande code gebruiken:

code:
1
2
3
4
SELECT TOP 1 tt.Number 
FROM TallyTable tt 
LEFT OUTER JOIN YourTable yt ON tt.Number = yt.Number 
WHERE yt.Number IS NULL ORDER BY Number ASC

Oops! Google Chrome could not find www.rijks%20museum.nl


  • bartvb
  • Registratie: Oktober 1999
  • Laatst online: 05-01 14:41
Simpele self join:

code:
1
2
3
4
SELECT
 min(a.id+1)
FROM 
 test a LEFT JOIN test b ON a.id + 1 = b.id where b.id is null;


edit:
Damn, te laat. Ik moet denk ik eerst maar eens wakker worden voor ik aan een topic op GoT meedoe ;)

[ Voor 31% gewijzigd door bartvb op 13-11-2003 11:31 ]


  • SuperJERK
  • Registratie: Januari 2002
  • Laatst online: 30-03 16:12
L_Jinx schreef op 13 november 2003 @ 11:26:
[...]

Ja dat is inderdaad wel eenvoudig. Maar aangezien je aangaf dat het om 30.000 records gaat, vind ik deze oplossing eigenlijk niet eenvoudig ;)
Ik denk dat de oplossing van de tabel met vrije ID's dan toch wel het makkelijkste is.
Maar goed, dit topic ging eigelijk niet over een tussen oplossing. Over deze oplossing heb ik nog niet nagedacht. Het ging er mij gewoon om of er een sql commando was dat ik nog niet kon en dat het daardoor opgelost zou kunnen worden.


Iedereen bedankt voor het antwoorden, maar zoals een paar van jullie al zeiden: het commando / sql statement wat ik zoek bestaat simpel weg niet ;)

Slotje dus maar?

EDIT: oh extra reacties bijgekomen.

[ Voor 4% gewijzigd door SuperJERK op 13-11-2003 11:32 ]


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
offtopic:
[quote]whoami schreef op 13 november 2003 @ 11:27:
Antwoord: nee.

Tenzij je misschien een tabel aanlegt met nrs van 1 tot max(id), jouw tabel joined met deze tabel of een subquery doet en zo het laagste id uit die tabel met id's haalt die niet in je tabel voorkomt waarin je een record wilt inserten.[/quote]

en toen was ik spuit 11... :(

Oops! Google Chrome could not find www.rijks%20museum.nl


  • whoami
  • Registratie: December 2000
  • Laatst online: 09:31
SuperJERK schreef op 13 november 2003 @ 11:30:
[...]


Iedereen bedankt voor het antwoorden, maar zoals een paar van jullie al zeiden: het commando / sql statement wat ik zoek bestaat simpel weg niet ;)
Lees mijn reply en die van P_d_B nog eens.

https://fgheysels.github.io/


  • bartvb
  • Registratie: Oktober 1999
  • Laatst online: 05-01 14:41
En die van mij ;) :P

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Jep, die is misschien nog wel netter. :)

Ik heb echter de tally tabel standaard in mijn db, vandaar dat ik die gebruik

Oops! Google Chrome could not find www.rijks%20museum.nl


  • SuperJERK
  • Registratie: Januari 2002
  • Laatst online: 30-03 16:12
P_de_B schreef op 13 november 2003 @ 11:29:
Ik ben het met de meeste reacties eens dat een autonummer een goed idee is, maar om de TS te antwoorden:
Nogmaals autonummer gebruiken we hier al, en daar gaat het ook helemaal niet om ;)


De SQL van P_de_B en bartvb is wel erg mooi :).
Nog even een aanmerking hierop SELECT TOP werkt alleen voor SQL Server (correct me if I'm wrong). Limit is daarvoor dus in de plaats te gebruiken voor MySQL

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
SuperJERK schreef op 13 november 2003 @ 11:38:
[...]

Limit is daarvoor dus in de plaats te gebruiken voor MySQL
Ja, sorry. Je hebt natuurlijk gelijk. LIMIT moet je gebruiken.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • bartvb
  • Registratie: Oktober 1999
  • Laatst online: 05-01 14:41
Mwoh. Een MIN() lijkt me hier handiger want je wilt alleen de laatste waarde. Als je LIMIT/TOP gebruikt moet je database alle resultaten onnodig zitten sorteren. Bij MIN() hoeft hij de resultaten alleen door te lopen op zoek naar de laagste.

  • SuperJERK
  • Registratie: Januari 2002
  • Laatst online: 30-03 16:12
bartvb schreef op 13 november 2003 @ 11:41:
Mwoh. Een MIN() lijkt me hier handiger want je wilt alleen de laatste waarde. Als je LIMIT/TOP gebruikt moet je database alle resultaten onnodig zitten sorteren. Bij MIN() hoeft hij de resultaten alleen door te lopen op zoek naar de laagste.
Als het goed is maakt het met LIMIT 1 of MIN/MAX qua snelheid niet uit. Bij beide moet de hele database worden doorgefietst, als ik tijd heb zal ik het eens testen ;)

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
bartvb schreef op 13 november 2003 @ 11:41:
Mwoh. Een MIN() lijkt me hier handiger want je wilt alleen de laatste waarde. Als je LIMIT/TOP gebruikt moet je database alle resultaten onnodig zitten sorteren. Bij MIN() hoeft hij de resultaten alleen door te lopen op zoek naar de laagste.
Ik ga er toch wel vanuit dat een goede query optimiser hier hetzelfde execution plan voor maakt.

Ik heb net gekeken bij SQL Server, en beide zijn even snel

Oops! Google Chrome could not find www.rijks%20museum.nl


  • bartvb
  • Registratie: Oktober 1999
  • Laatst online: 05-01 14:41
Klopt, maar het is nogal een verschil of je een paar honderd duizend records op volgorde moet zetten of dat je alleen maar hoeft te kijken of het volgende record lager is dan de laagste waarde die je tot dan toe hebt gezien :)

Weet eigenlijk niet of de index op de IDs gebruikt zou kunnen worden in dit geval. Als dat zo is stelt het sorteren ook niets voor. Maar testje zou leuk zijn idd ;)

edit:
P_de_B: hoe lang duurde de queries dan en over hoeveel rows ging het?

[ Voor 10% gewijzigd door bartvb op 13-11-2003 11:48 ]


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
P_de_B: hoe lang duurde de queries dan en over hoeveel rows ging het?
< 1 sec, 124500 rows

clustered index op de rij die de gegevens bevat.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • whoami
  • Registratie: December 2000
  • Laatst online: 09:31
P_de_B schreef op 13 november 2003 @ 11:52:
[...]


< 1 sec, 124500 rows

clustered index op de rij die de gegevens bevat.
Daar zeg je het ook al. Door die clustered index zijn de gegevens al fysiek in die volgorde opgeslagen.

https://fgheysels.github.io/


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 09:42

Tomatoman

Fulltime prutser

P_de_B schreef op 13 november 2003 @ 11:52:
[...]


< 1 sec, 124500 rows

clustered index op de rij die de gegevens bevat.
Iedere keer een seconde wachten terwijl dat volkomen overbodig is, vind ik nogal veel gevraagd van de gebruiker.

Het antwoord van de topicstarter op de vraag waarom hij geen autonummering wil gebruiken, is dat hij de tussenliggende nummers wil hergebruiken. Vraag aan SuperJERK: waarom wil je die tussenliggende nummers hergebruiken? Wat heeft dat voor nut? Je mag best eigenwijs zijn, maar dan moet je wel een argumenten hebben waarom.

Een goede grap mag vrienden kosten.


  • SuperJERK
  • Registratie: Januari 2002
  • Laatst online: 30-03 16:12
tomatoman schreef op 13 november 2003 @ 12:18:
[...]
Vraag aan SuperJERK: waarom wil je die tussenliggende nummers hergebruiken? Wat heeft dat voor nut? Je mag best eigenwijs zijn, maar dan moet je wel een argumenten hebben waarom.
Ik heb een aantal links. Deze links worden op een site getoond. Per link kan je kiezen op welke plaats deze worden getoond. 1 is bijv. helemaal bovenaan 30.000 is helemaal onderaan. Nu wil ik bijv. een link op de eerste vrije plaats van 10 neerzetten. Dus moet ik in de database opzoek gaan naar de eerste vrij plaats vanaf 10.

Heeft volgens mij dus helemaal niks met auto_increment te maken. En btw auto_increment gebruik ik al voor de linkid.

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 09:42

Tomatoman

Fulltime prutser

Ik begrijp het nog steeds niet. Hoe wil je dan een link invoegen tussen de records met ID 100 en 101?

De ordening van de records in een tabel heeft geen relatie met de ordening die een query teruggeeft. Is dat wel het geval, dan klopt je datamodel niet. Je misbruikt de ID nu als een ordeningcriterium van de tabel. Je kunt beter niet de tabel ordenen, maar dat laten doen door de query die de data ophaalt. Moeten de links bijvoorbeeld alfabetisch worden gesorteerd, dan doe je dat toch gewoon met een SORT BY of ORDER BY in de query. Wil je ze sorteren op datum, dan voeg je een veld 'MijnDatum' toe in de tabel. Wil je ze sorteren op een of ander integer getal, dan voeg je een veld 'MijnGetal' toe in de tabel. Maar gebruik in ieder geval niet de ID van de records hiervoor.

[ Voor 3% gewijzigd door Tomatoman op 13-11-2003 12:51 ]

Een goede grap mag vrienden kosten.


  • SuperJERK
  • Registratie: Januari 2002
  • Laatst online: 30-03 16:12
Het gaat niet om de ID het gaat om de plaats.
code:
1
2
3
4
5
Linkid  Naam            Url                   Plaats
1       Computer       http://www.computer      6
2       Muis           http://muis.com          2
5       Toetsenbord    http://bordje.com        1
9       Kaas           http://www.schimmel.nl   3


Dus nu wil ik een nieuwe record toevoegen en die op de eerste vrije plaats vanaf 2 neerzetten.

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 09:42

Tomatoman

Fulltime prutser

Dat gaat dan toch gewoon met autonummering voor het veld Linkid? De waarde van Linkid heeft niets met de waarde van plaats te maken, dus is het geen enkel probleem als je bij Linkid vrolijk doornummert vanaf 9. Die waarde van Linkid komt toch niet voor in je query.
SQL:
1
2
3
SELECT Naam, Url, Plaats
FROM MijnTabel
ORDER BY Plaats, Naam, Url
Nu worden ze netjes op plaats geordend en is dit de output:
code:
1
2
3
4
5
Naam           Url                    Plaats
Toetsenbord    http://bordje.com        1
Muis           http://muis.com          2
Kaas           http://www.schimmel.nl   3
Computer       http://www.computer      6
Dat is toch wat je wilt, of begrijp ik het verkeerd?

Een goede grap mag vrienden kosten.


  • EfBe
  • Registratie: Januari 2000
  • Niet online
SuperJERK schreef op 13 november 2003 @ 13:14:
Het gaat niet om de ID het gaat om de plaats.
code:
1
2
3
4
5
Linkid  Naam            Url                   Plaats
1       Computer       http://www.computer      6
2       Muis           http://muis.com          2
5       Toetsenbord    http://bordje.com        1
9       Kaas           http://www.schimmel.nl   3


Dus nu wil ik een nieuwe record toevoegen en die op de eerste vrije plaats vanaf 2 neerzetten.
Het probleem is: je moet de gehele table locken wil je dit foutvrij krijgen, want het is altijd mogelijk dat 2 processes dezelfde spot zien en daar hun record neer plempen.

Dus table locken: slot zoeken, row inserten, table vrijgeven.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
tomatoman schreef op 13 november 2003 @ 13:24:
Dat gaat dan toch gewoon met autonummering voor het veld Linkid? De waarde van Linkid heeft niets met de waarde van plaats te maken, dus is het geen enkel probleem als je bij Linkid vrolijk doornummert vanaf 9. Die waarde van Linkid komt toch niet voor in je query.
SQL:
1
2
3
SELECT Naam, Url, Plaats
FROM MijnTabel
ORDER BY Plaats, Naam, Url
Nu worden ze netjes op plaats geordend en is dit de output:
code:
1
2
3
4
5
Naam           Url                    Plaats
Toetsenbord    http://bordje.com        1
Muis           http://muis.com          2
Kaas           http://www.schimmel.nl   3
Computer       http://www.computer      6
Dat is toch wat je wilt, of begrijp ik het verkeerd?
Tomatoman, hij heeft een veld 'plaats' dat als volgorde gebruikt wordt. Dit heeft niets met ID, automummering of wat dan ook van doen, dat is een spraakverwarring die erin gekomen is.

Om het voorbeeld maar even te gebruiken, TS wil graag een record toevoegen dat na schimmel.nl en voor computer.nl getoond wordt, dit record moet dus een plaats van 4 krijgen.

code:
1
2
3
4
5
6
Naam           Url                    Plaats
Toetsenbord    http://bordje.com        1
Muis           http://muis.com          2
Kaas           http://www.schimmel.nl   3
Nieuw           http://www.nieuw.nl   4
Computer       http://www.computer      6

Oops! Google Chrome could not find www.rijks%20museum.nl


  • Jaspertje
  • Registratie: September 2001
  • Laatst online: 18-03 13:46

Jaspertje

Max & Milo.. lief

Ik weet niet of de TS kennis van XML heeft, maar dit zou dus perfect op te lossen zijn in XML.. Daarin is het heel makkelijk om dingen voor of achter het ander in te voeren.. Maar dit is terzijde..

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 09:42

Tomatoman

Fulltime prutser

Blijft nog steeds de vraag: waarom moet die link perse op plaats 4 komen en niet op 7 of misschien wel 1000? Ik ben er stellig van overtuigd dat hier een betere oplossing voor te verzinnen is.

Een goede grap mag vrienden kosten.


  • Jaspertje
  • Registratie: September 2001
  • Laatst online: 18-03 13:46

Jaspertje

Max & Milo.. lief

tomatoman schreef op 13 november 2003 @ 14:00:
Blijft nog steeds de vraag: waarom moet die link perse op plaats 4 komen en niet op 7 of misschien wel 1000? Ik ben er stellig van overtuigd dat hier een betere oplossing voor te verzinnen is.
Komt u maar zou ik dan zeggen :P

  • SuperJERK
  • Registratie: Januari 2002
  • Laatst online: 30-03 16:12
tomatoman schreef op 13 november 2003 @ 14:00:
Blijft nog steeds de vraag: waarom moet die link perse op plaats 4 komen en niet op 7 of misschien wel 1000? Ik ben er stellig van overtuigd dat hier een betere oplossing voor te verzinnen is.
Omdat anders de link op plaats 1000 komt en 1000 is helemaal onderaan de pagina en ik wil em dan graag op plaats 4 staan.

Volgens mij ben je de kluts een beetje kwijt in deze wirwar van vrage en antwoorden ;)

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 01-04 18:12

Creepy

Tactical Espionage Splatterer

Jaspertje schreef op 13 november 2003 @ 13:56:
Ik weet niet of de TS kennis van XML heeft, maar dit zou dus perfect op te lossen zijn in XML.. Daarin is het heel makkelijk om dingen voor of achter het ander in te voeren.. Maar dit is terzijde..
Ook als je met 2 of meer personen tegelijk aan het rommelen bent?

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • SuperRembo
  • Registratie: Juni 2000
  • Laatst online: 20-08-2025
SuperJERK schreef op 13 november 2003 @ 11:27:
[...]
Geen droom, alleen het zou erg mooi zijn. Met subqueries zal het wel kunnen, maar ze draaien hier MySQL (en wel een ouwere versie dan diegene die wel subqueries ondersteunen.).

Maar dit is wel een duidelijk antwoord :)
code:
1
2
3
4
5
SELECT TOP 1 
    test1.Id + 1 AS EersteVrijeId
FROM test test1 LEFT OUTER JOIN test test2 ON test1.Id + 1 = test2.Id
WHERE test2.Id IS NULL
ORDER BY test1.Id

TSQL, maar zonder subqueries, dus die moet met een kleine aanpassing ook op MySQL werken.
Droom lekker verder :Z :P

| Toen / Nu


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
SuperRembo schreef op 13 november 2003 @ 14:46:
[...]
code:
1
2
3
4
5
SELECT TOP 1 
    test1.Id + 1 AS EersteVrijeId
FROM test test1 LEFT OUTER JOIN test test2 ON test1.Id + 1 = test2.Id
WHERE test2.Id IS NULL
ORDER BY test1.Id

TSQL, maar zonder subqueries, dus die moet met een kleine aanpassing ook op MySQL werken.
Droom lekker verder :Z :P
Over deze oplossing waren we het een hele tijd geleden al eens hoor. De enige onduidelijkheid ligt nog bij tomatoman die volgens mij niet helemaal begrijpt wat de TS wil.

@tomatoman, de TS wil een bepaalde link op een specifieke locatie zetten, niet gebaseerd op de volgorde van invoer oid.

De enige andere oplossing is IMHO, om een veld volgorde bij te houden en elke keer all records die boven een nieuw geinsert record liggen met 1 op te hogen

dus als je 1,2,3,4,5 heb, en je wil op positie 3 iets toevoegen moet je de volgende query gebruiken

code:
1
2
UPDATE Tabel
SET Volgordeveld = VolgordeVeld + 1 WHERE VOlgordeveld >=3


edit:

nofi trouwens tomatoman :) maar ik denk dat je een beetje in de war bent van de wazige discussie ..

[ Voor 6% gewijzigd door P_de_B op 13-11-2003 14:51 ]

Oops! Google Chrome could not find www.rijks%20museum.nl


  • Jaspertje
  • Registratie: September 2001
  • Laatst online: 18-03 13:46

Jaspertje

Max & Milo.. lief

Creepy schreef op 13 november 2003 @ 14:45:
[...]

Ook als je met 2 of meer personen tegelijk aan het rommelen bent?
Dan kan het gevaarlijk worden, dan zou je een lock moeten zetten...

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 09:42

Tomatoman

Fulltime prutser

P_de_B schreef op 13 november 2003 @ 14:50:
@tomatoman, de TS wil een bepaalde link op een specifieke locatie zetten, niet gebaseerd op de volgorde van invoer oid.
Eens. Volgens de vraag van de topicstarter is dat altijd een heel specifieke locatie, namelijk de eerste vrije plaats. Zijn de plaatsen 1, 2, 3, 6 en 9 al bezet, dan moet de link dus op plaats 4 komen.
De enige andere oplossing is IMHO, om een veld volgorde bij te houden en elke keer all records die boven een nieuw geinsert record liggen met 1 op te hogen

dus als je 1,2,3,4,5 heb, en je wil op positie 3 iets toevoegen moet je de volgende query gebruiken [...]
Dat is nou juist het punt, hij wil volgens zijn eigen uitleg helemaal niets op plaats 3 invoegen, maar op de eerste vrije plaats. In dit geval is dat dus plaats 6.
edit:

nofi trouwens tomatoman :) maar ik denk dat je een beetje in de war bent van de wazige discussie ..
:? Klopt. Zolang de topicstarter niet heeft uitgelegd waarom die link nou juist op de eerste vrije plaats moet komen, vind ik het maar een vaag verhaal. Ik snap wel dat hij dat wil, maar niet waarom.

Een goede grap mag vrienden kosten.


  • D2k
  • Registratie: Januari 2001
  • Laatst online: 09-01 11:25

D2k

Jaspertje schreef op 13 november 2003 @ 13:56:
Ik weet niet of de TS kennis van XML heeft, maar dit zou dus perfect op te lossen zijn in XML.. Daarin is het heel makkelijk om dingen voor of achter het ander in te voeren.. Maar dit is terzijde..
wat een gelul
jij bent er ook zo 1 die van de XML hype gehoord heeft maar geen idee heeft waar het feitelijk voor bedoeld is

XML is geen DBMS!!!!!!

Doet iets met Cloud (MS/IBM)


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 01-04 18:12

Creepy

Tactical Espionage Splatterer

Jaspertje schreef op 13 november 2003 @ 15:08:
[...]


Dan kan het gevaarlijk worden, dan zou je een lock moeten zetten...
En het voordeel van de data opslag in XML t.o.v. een RDMS is? (want ik zie het voordeel in XML voor dataopslag totaal niet :P ).

Edit: ennuh.. een lock, op de complete XML file? Of kan ik ook een deel van een XML file locken? ;)

[ Voor 15% gewijzigd door Creepy op 13-11-2003 15:59 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Jaspertje
  • Registratie: September 2001
  • Laatst online: 18-03 13:46

Jaspertje

Max & Milo.. lief

D2k schreef op 13 november 2003 @ 15:44:
[...]
wat een gelul
jij bent er ook zo 1 die van de XML hype gehoord heeft maar geen idee heeft waar het feitelijk voor bedoeld is

XML is geen DBMS!!!!!!
Hype??

Nee hoor, en ik zeg ook niet dat XML beter is, sterker nog, als je met relatie's gaat werken dan valt XML af..

Maar als je een menu gaat bouwen waarbij je de positie mee moet geven omdat dat belangrijk is, dan kan je helemaal moeilijk gaan doen door dus een extra record vast te houden.

Wat je ook kan doen is het opslaan in xml.. en dan direct op de positie waar ie moet staan.

code:
1
2
3
4
5
6
<XML>
  <MENU href="blabnla.nl" title="ga naar bla">
  <MENU href="blabnlatop.asp" title="ga naar de top">
  <MENU href="poepisbruin.asp" title="Bah">
  <MENU href="nogeen.html" title="HTML ruled">
</XML>


het is idd niet makkelijk als het met allerlei andere data in de DB verbonden is en dat zal ik ook niet zeggen.. dat heb ik trouwens ook nog nergens neergezet.... of zie jij het wel??
-edit zoveel-
OK het is niet perfect op te lossen in XML, maar_we_op_te_lossen in XML..

[ Voor 38% gewijzigd door Jaspertje op 13-11-2003 16:09 ]


  • D2k
  • Registratie: Januari 2001
  • Laatst online: 09-01 11:25

D2k

Jaspertje schreef op 13 november 2003 @ 16:07:
[...]
Wat je ook kan doen is het opslaan in xml.. en dan direct op de positie waar ie moet staan.
D2k schreef op 13 november 2003 @ 15:44:
[...]
XML is geen DBMS!!!!!!
Creepy schreef op 13 november 2003 @ 15:49:
[...]

En het voordeel van de data opslag in XML t.o.v. een RDMS is? (want ik zie het voordeel in XML voor dataopslag totaal niet :P ).

Doet iets met Cloud (MS/IBM)


  • Jaspertje
  • Registratie: September 2001
  • Laatst online: 18-03 13:46

Jaspertje

Max & Milo.. lief

Ja wat wil je hiermee zeggen??

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 09-01 11:25

D2k

Jaspertje schreef op 13 november 2003 @ 16:14:
Ja wat wil je hiermee zeggen??
dat je dus geen data moet gaan opslaan in XML
wat jij dus voor de 2e keer als oplossing aandraagt.

Doet iets met Cloud (MS/IBM)


  • Jaspertje
  • Registratie: September 2001
  • Laatst online: 18-03 13:46

Jaspertje

Max & Milo.. lief

Ik zeg niet dat het moet, ik zeg dat het een oplossing is de 2e keer.. de 1e keer was wat te enthousiast inderdaad... maar nog blijf ik erbij dat het een oplossing is.. aangezien het opslaan in de database zelf ook al voor veel problemen zorgt, kan je daar ook geen perfecte oplossing in verzinnen... of is die oplossing met 2 tabellen wel een goede oplossing volgens jou?)

[ Voor 23% gewijzigd door Jaspertje op 13-11-2003 16:20 ]


Verwijderd

Ff ontopic maar weer..

Heb zoiets als 's eerder gemaakt.
Je moet zoiets hebben:

SELECT MAX(ID) FROM table where MAX(ID)< (SELECT MAX(ID) FROM table)

kweenie of het helemaal goed is, maar stoei hier 's mee...

  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

Dat levert dus op, bij een MAX(ID) van 100:

SELECT 100 WHERE 100 < 100

kweenie of ik het helemaal snap ... :+

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


Verwijderd

ik zeg toch.. ff stoeien.. maar zoiets is het wel

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Verwijderd schreef op 13 november 2003 @ 16:30:
ik zeg toch.. ff stoeien.. maar zoiets is het wel
Het goede antwoord is al meerdere keren gegeven is de thread.

Oops! Google Chrome could not find www.rijks%20museum.nl


Verwijderd

Ik heb ook nog wel wat: Je moet gewoon die hele tabel vullen met records waarvan het id doorloopt. Als er een url verwijderd moet worden, verwijder je alleen het url niet het record.


Voor het selecteren van alle url's doe je dan:
SELECT * FROM tabel WHERE not isnull(url).

invoegen doe je met SELECT MIN(id) FROM tabel WHERE isnull(url)
UPDATE tabel SET url = "www.bla.nl" WHERE ID = id

Je hebt twee statements nodig voor het inserten. en 1 voor het selecteren. Ik geef toe, dat het wel wat fragmentatie in je tabel kan opleveren.

[ Voor 6% gewijzigd door Verwijderd op 13-11-2003 16:50 ]


  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

Verwijderd schreef op 13 november 2003 @ 16:30:
ik zeg toch.. ff stoeien.. maar zoiets is het wel
Ik kan er met al mijn MCDBA-kennis en DB-schoolvakken niet bij hoe een oplossing in de buurt zou komen van die query :?

Ja dat was zelfspot, titels zeggen niet alles B)

En inderdaad, het antwoord is allang gegeven :)

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


  • bartvb
  • Registratie: Oktober 1999
  • Laatst online: 05-01 14:41
Vroegah, toen /14 nog nivo had :Y)
zoek eens een paar oude p&w threads op, en vergelijk deze eens met een paar recentere threads.

Zullen we afspreken dat vanaf nu alleen nog maar de mensen reageren die het hele topic gelezen hebben en die iig soort van een clue hebben waar het topic over gaat? Thanks 8)7
En waar doel je nu op?

[ Voor 29% gewijzigd door whoami op 14-11-2003 10:37 ]

Pagina: 1