Toon posts:

Mysql automatisch incrementen fix?

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hey Tweakers,

Ik heb een vraag, ik heb een soort systeem gebouwt (ben niet de beste developer dus please dont blame me). Maar dat systeem maakt regels aan, die krijgen ook automatisch een ID meegegeven vanuit de database gewoon via dat auto increment gebeuren, alleen als ik dan een regel verwijder en weer een nieuwe toevoeg gaat die regel niet op die plek, en dat ziet er een beetje lelijk uit want dan heb je :

Regel 1
Regel 2
Regel 4
Regel 8
zoiets bijvoorbeeld.

En je kan het wel handmatig regelen, maar automatisch is toch het fijnst. Weten jullie hier een fix voor dat ID's automatisch opschuiven naar de juiste plek? Ik hoop dat jullie begrijpen wat ik bedoel :P op me vorige ticket werd heel veel gereageerd en dat waardeer ik echt! Alvast bedankt :)

Beste antwoord (via Verwijderd op 03-06-2016 09:57)


  • Edwin88
  • Registratie: Januari 2005
  • Laatst online: 03-10 23:05
Dit is iets wat je in je user interface moet oplossen. De database kijk je in principe nooit zelf naar!

Als je bijvoorbeeld je gegevens in een loopje neerplempt op de pagina kan je met een $index bijhouden welk nummer ze nodig hebben, ongeacht welk ID dat item zelf heeft.

code:
1
2
3
4
5
counter = 0
foreach(element in array) {
  counter++
  print(element + counter)
}

Alle reacties


Acties:
  • +1 Henk 'm!

  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

Ten eerste hebben we hier geen tickets maar topics, en ten tweede als je dat per se wilt (wat compleet nutteloos is), dan is daarvoor
SQL:
1
ALTER TABLE tablename AUTO_INCREMENT = 1


waar 1 is het getal waar je verder wilt gaan.

Als je wilt dat dat automatisch gebeurt elke keer dat je iets verwijdert: dat kan niet.

[ Voor 19% gewijzigd door CyBeR op 04-05-2016 02:55 ]

All my posts are provided as-is. They come with NO WARRANTY at all.


Acties:
  • +3 Henk 'm!

  • Cyphax
  • Registratie: November 2000
  • Laatst online: 09:34

Cyphax

Moderator LNX
Dat automatische ID is een betekenisloze sleutel, waarmee gaten eigenlijk ook geen betekenis hebben. Moet je ook eigenlijk zo laten. :)

Saved by the buoyancy of citrus


Acties:
  • +3 Henk 'm!

  • Tsurany
  • Registratie: Juni 2006
  • Niet online

Tsurany

⭐⭐⭐⭐⭐

Het hele idee van zo'n id is dat het een unieke sleutel is. Dat aanpassen moet je echt niet willen, dan gaat je data door elkaar lopen. Als je nieuwe regels het id van ouderen laat aannemen kan je programma aardig in de war raken of verkeerde data gaan retourneren omdat je queries uitvoert op id's die inmiddels verwijdert zijn en waar later nieuwe voor in de plaats zijn gekomen.

Dit id is namelijk een unieke sleutel, geen rij nummer zoals in bijvoorbeeld Excel. Daar moet je het ook niet voor gaan gebruiken.

[ Voor 14% gewijzigd door Tsurany op 04-05-2016 07:41 ]

SMA SB5.0 + 16x Jinko 310wp OWO + 10x Jinko 310wp WNW |--|--| Daikin 4MXM68N + 1x FTXA50AW + 3x FTXM20N


Acties:
  • 0 Henk 'm!

  • eheijnen
  • Registratie: Juli 2008
  • Niet online
Verwijderd schreef op woensdag 04 mei 2016 @ 02:10:
Hey Tweakers,

Ik heb een vraag, ik heb een soort systeem gebouwt (ben niet de beste developer dus please dont blame me). Maar dat systeem maakt regels aan, die krijgen ook automatisch een ID meegegeven vanuit de database gewoon via dat auto increment gebeuren, alleen als ik dan een regel verwijder en weer een nieuwe toevoeg gaat die regel niet op die plek, en dat ziet er een beetje lelijk uit want dan heb je :

Regel 1
Regel 2
Regel 4
Regel 8
zoiets bijvoorbeeld.

En je kan het wel handmatig regelen, maar automatisch is toch het fijnst. Weten jullie hier een fix voor dat ID's automatisch opschuiven naar de juiste plek? Ik hoop dat jullie begrijpen wat ik bedoel :P op me vorige ticket werd heel veel gereageerd en dat waardeer ik echt! Alvast bedankt :)
Dat is niet mogelijk. Auto Increment is een uniek identificatienummer dat door het systeem wordt toegewezen en uitsluitend wordt opgehoogd bij de volgende insert-opdracht. Dit ID is uitsluitend gedacht om een record uniek te kunnen identificeren / adresseren (aanwijzen, uniek te maken). Alle andere gegevens in een record kunnen identiek zijn daarom dit unieke-ID.

Wie du mir, so ich dir.


Acties:
  • 0 Henk 'm!

  • Tsurany
  • Registratie: Juni 2006
  • Niet online

Tsurany

⭐⭐⭐⭐⭐

Wat je trouwens wel kan doen is je id's via een aparte sequence genereren. Dan kan je bij een delete dat id wegschrijven naar een tussentabel en die bij een nieuwe insert eerst raadplegen voor je het eerst volgende id binnen de sequence opvraagt. Volstrekt zinloos maar het kan wel :)

SMA SB5.0 + 16x Jinko 310wp OWO + 10x Jinko 310wp WNW |--|--| Daikin 4MXM68N + 1x FTXA50AW + 3x FTXM20N


Acties:
  • 0 Henk 'm!

  • Caelorum
  • Registratie: April 2005
  • Laatst online: 11:06
Doe dat echt absoluut niet. Ik moet met een systeem werken waarbij we zelf de id's moeten genereren. Echt dagelijks moet ik met de hand data lopen fixen, omdat er weer eens een dubbele id is. Ondanks dat we echt alles met transactions doen, soms maakt iemand een fout en dat werkt echt maanden door.

Acties:
  • +2 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Wat me meer intrigeert is dat je zegt : Dat ziet er lelijk uit... Hoe bedoel je dat?

In principe is een id gewoon een dbase-eigen dingetje wat geen meerwaarde heeft om ergens te tonen oid.

Oftewel waar zie jij het terugkomen dat je het lelijk vind? Want je kan bij het tonen van regels wel binnen 2 seconden bepalen welke regel binnen de recordset het is door zelf een tellertje bij te houden en dit elke keer dat je een nieuw resultaat binnenkrijgt dit op te hogen met 1 tijdens het weergeven naar je scherm.

Dan krijg je wel een regelnummer wat iets zegt binnen je representatie

Acties:
  • 0 Henk 'm!

  • Tsurany
  • Registratie: Juni 2006
  • Niet online

Tsurany

⭐⭐⭐⭐⭐

Caelorum schreef op woensdag 04 mei 2016 @ 08:14:
Doe dat echt absoluut niet. Ik moet met een systeem werken waarbij we zelf de id's moeten genereren. Echt dagelijks moet ik met de hand data lopen fixen, omdat er weer eens een dubbele id is. Ondanks dat we echt alles met transactions doen, soms maakt iemand een fout en dat werkt echt maanden door.
Zelf id's genereren is natuurlijk wat anders dan een sequence gebruiken binnen de database. En als je je inserts in een transactie stopt en een unieke constraint op het id veld vastlegt kan er niet heel veel mis gaan. Alsnog is hergebruik van verwijderde id's natuurlijk niet aan te raden.

SMA SB5.0 + 16x Jinko 310wp OWO + 10x Jinko 310wp WNW |--|--| Daikin 4MXM68N + 1x FTXA50AW + 3x FTXM20N


Acties:
  • 0 Henk 'm!

  • Onoffon
  • Registratie: April 2006
  • Laatst online: 10:20
Ik zou het dan niet op db laag oplossen maar op de applicatielaag, maak een extra kolom aan met daarin de juiste waarde, je zou dan iets moeten verzinnen waar je checkt op het eerstvolgende vrije nummer, dit vergt dan wel een extra query. Daarna via de de bestaande INSERT dit veld toevoegen.

Dat gezegd hebbende ben ik het eens met wat er bovenstaand ook al gezegd is. Ik vraag me af of je dit veld alleen in de database hebt staan ter unieke herkenning of dat je het ook daadwerkelijk ergens in de GUI laat zien bijvoorbeeld.

Just a simple thought....


Acties:
  • +1 Henk 'm!

  • Kettrick
  • Registratie: Augustus 2000
  • Laatst online: 01:52

Kettrick

Rantmeister!

Caelorum schreef op woensdag 04 mei 2016 @ 08:14:
Doe dat echt absoluut niet. Ik moet met een systeem werken waarbij we zelf de id's moeten genereren. Echt dagelijks moet ik met de hand data lopen fixen, omdat er weer eens een dubbele id is. Ondanks dat we echt alles met transactions doen, soms maakt iemand een fout en dat werkt echt maanden door.
Zelf ID's genereren is prima, maar gebruik dan wel een geldig soort ID zoals een UUID ;)

Acties:
  • Beste antwoord
  • +1 Henk 'm!

  • Edwin88
  • Registratie: Januari 2005
  • Laatst online: 03-10 23:05
Dit is iets wat je in je user interface moet oplossen. De database kijk je in principe nooit zelf naar!

Als je bijvoorbeeld je gegevens in een loopje neerplempt op de pagina kan je met een $index bijhouden welk nummer ze nodig hebben, ongeacht welk ID dat item zelf heeft.

code:
1
2
3
4
5
counter = 0
foreach(element in array) {
  counter++
  print(element + counter)
}

Acties:
  • 0 Henk 'm!

  • Caelorum
  • Registratie: April 2005
  • Laatst online: 11:06
Tsurany schreef op woensdag 04 mei 2016 @ 08:17:
[...]
Zelf id's genereren is natuurlijk wat anders dan een sequence gebruiken binnen de database. En als je je inserts in een transactie stopt en een unieke constraint op het id veld vastlegt kan er niet heel veel mis gaan. Alsnog is hergebruik van verwijderde id's natuurlijk niet aan te raden.
Dat gaat gegarandeerd een keer fout. Iemand wijzigt iets met de hand in de database of vergeet een insert in een transactie te stoppen en je bent de sjaak.
Kettrick schreef op woensdag 04 mei 2016 @ 08:59:
[...]
Zelf ID's genereren is prima, maar gebruik dan wel een geldig soort ID zoals een UUID ;)
Ja, ok. Ik las het als een integer bijhouden en met de hand ophogen ofzo. GUID is overigens niet gegarandeerd uniek. Ook daar kan je problemen mee krijgen als je ze op verschillende machines genereerd (al hoop ik dat je de database dat laat afhandelen).

Acties:
  • 0 Henk 'm!

  • Merethil
  • Registratie: December 2008
  • Laatst online: 11-10 20:24
Caelorum schreef op woensdag 04 mei 2016 @ 10:27:
[...]

Ja, ok. Ik las het als een integer bijhouden en met de hand ophogen ofzo. GUID is overigens niet gegarandeerd uniek. Ook daar kan je problemen mee krijgen als je ze op verschillende machines genereerd (al hoop ik dat je de database dat laat afhandelen).
Hij heeft het over een UUID, wat technisch gezien wel over meerdere machines uniek zou moeten zijn. Of in ieder geval; zo zou je het moeten kunnen maken als je meer doet dan alleen een "createNewUUID()"-achtige-method in je specifieke taal aanroepen.

Acties:
  • 0 Henk 'm!

  • Tsurany
  • Registratie: Juni 2006
  • Niet online

Tsurany

⭐⭐⭐⭐⭐

Caelorum schreef op woensdag 04 mei 2016 @ 10:27:
[...]

Dat gaat gegarandeerd een keer fout. Iemand wijzigt iets met de hand in de database of vergeet een insert in een transactie te stoppen en je bent de sjaak.
Als je met een stel incompetente ontwikkelaars en/of beheerder werkt moet dit wel je laatste zorg zijn ;)
Je kan natuurlijk van alles verneuken aan een database maar dat moet geen reden zijn om niet een externe sequence te gebruiken.
Caelorum schreef op woensdag 04 mei 2016 @ 10:27:
Ja, ok. Ik las het als een integer bijhouden en met de hand ophogen ofzo. GUID is overigens niet gegarandeerd uniek. Ook daar kan je problemen mee krijgen als je ze op verschillende machines genereerd (al hoop ik dat je de database dat laat afhandelen).
Kan toch ook prima? Sequence in je database aanmaken en altijd een select next value gebruiken.

[ Voor 31% gewijzigd door Tsurany op 04-05-2016 12:06 ]

SMA SB5.0 + 16x Jinko 310wp OWO + 10x Jinko 310wp WNW |--|--| Daikin 4MXM68N + 1x FTXA50AW + 3x FTXM20N


Acties:
  • 0 Henk 'm!

  • Hydra
  • Registratie: September 2000
  • Laatst online: 06-10 13:59
Caelorum schreef op woensdag 04 mei 2016 @ 10:27:
Ja, ok. Ik las het als een integer bijhouden en met de hand ophogen ofzo. GUID is overigens niet gegarandeerd uniek.
Er is ook geen garantie dat ons universum morgen nog bestaat.

https://niels.nu


Acties:
  • 0 Henk 'm!

  • M4RTiN
  • Registratie: Augustus 2000
  • Laatst online: 24-11-2024
Ik heb eens een tabel gehad, waarbij in de primary key geen gaten mochten komen, ik doe dan gewoon een check wat het hoogste id is voordat ik een nieuwe insert doe. Werkt perfect.

Acties:
  • 0 Henk 'm!

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
M4RTiN schreef op woensdag 04 mei 2016 @ 13:17:
Ik heb eens een tabel gehad, waarbij in de primary key geen gaten mochten komen, ik doe dan gewoon een check wat het hoogste id is voordat ik een nieuwe insert doe. Werkt perfect.
Dan moet je dus voor een insert de hele tabel locken. Dat lijkt me nogal slecht voor je performance?

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


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

M4RTiN schreef op woensdag 04 mei 2016 @ 13:17:
Ik heb eens een tabel gehad, waarbij in de primary key geen gaten mochten komen, ik doe dan gewoon een check wat het hoogste id is voordat ik een nieuwe insert doe. Werkt perfect.
....tot je een race condition krijgt, tenzij je inderdaad met locking gaat werken. Bovendien kan ik me niet voorstellen waarom je PK geen gaten zou mogen hebben, introduceer dan een tweede kolom voor die nummering en laat je PK altijd met rust.

Nog naast het feit overigens dat je met jouw methode alsnog gaten krijgt als je rijen hebt voor ID's 1 t/m 10 en dan ID 5 verwijdert. Bij de volgende insert is het hoogste ID 10, dus ga je 11 inserten.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Hydra
  • Registratie: September 2000
  • Laatst online: 06-10 13:59
M4RTiN schreef op woensdag 04 mei 2016 @ 13:17:
Ik heb eens een tabel gehad, waarbij in de primary key geen gaten mochten komen
En waarom mocht dat niet dan?

https://niels.nu


Acties:
  • 0 Henk 'm!

  • Cyphax
  • Registratie: November 2000
  • Laatst online: 09:34

Cyphax

Moderator LNX
M4RTiN schreef op woensdag 04 mei 2016 @ 13:17:
Ik heb eens een tabel gehad, waarbij in de primary key geen gaten mochten komen, ik doe dan gewoon een check wat het hoogste id is voordat ik een nieuwe insert doe. Werkt perfect.
Het klinkt (maar het is een enorme aanname natuurlijk) alsof je een requirement hebt gekregen die je beter kan oplossen op een manier waarmee je de primary key en alles wat daarbij komt kijken met rust laat.

Ik heb weleens een vergelijkbaar verzoek gehad, maar dan andersom. Of we niet bij een vrij hoog getal konden beginnen zodat klanten niet van die lage nummers zagen, want dat gaf de indruk dat het maar een paar gebruikers had in het begin. :+

Saved by the buoyancy of citrus


Acties:
  • 0 Henk 'm!

  • Merethil
  • Registratie: December 2008
  • Laatst online: 11-10 20:24
Cyphax schreef op woensdag 04 mei 2016 @ 13:38:
[...]

Het klinkt (maar het is een enorme aanname natuurlijk) alsof je een requirement hebt gekregen die je beter kan oplossen op een manier waarmee je de primary key en alles wat daarbij komt kijken met rust laat.

Ik heb weleens een vergelijkbaar verzoek gehad, maar dan andersom. Of we niet bij een vrij hoog getal konden beginnen zodat klanten niet van die lage nummers zagen, want dat gaf de indruk dat het maar een paar gebruikers had in het begin. :+
IDENTITY(3924885, 1)?
Het lijkt me op zich dat als je bijvoorbeeld van je ID ook direct een klantnummer wilt maken, je begint met een getal hoger dan "1". Ik heb gewerkt in een bedrijf waar klantnummers op die manier gegenereerd werden ( telefonische helpdesk toentertijd) en het is heel vreemd als een klant zijn klantnummer door wil geven en zegt "ik ben klant nummer 5" terwijl de rest 6+ getallen lang was :+

Acties:
  • 0 Henk 'm!

  • ThomasG
  • Registratie: Juni 2006
  • Laatst online: 23-09 14:00
Het is sowieso een heel slecht idee om een klant nummer overeen te laten komen met een auto_increment/sequence primary key van een database tabel. Als je het klantnummer als primary key wilt, wat in bepaalde gevallen logisch is, zou dit nooit een auto_increment kolom mogen zijn.

Acties:
  • 0 Henk 'm!

  • Merethil
  • Registratie: December 2008
  • Laatst online: 11-10 20:24
ThomasG schreef op woensdag 04 mei 2016 @ 13:49:
Het is sowieso een heel slecht idee om een klant nummer overeen te laten komen met een auto_increment/sequence primary key van een database tabel. Als je het klantnummer als primary key wilt, wat in bepaalde gevallen logisch is, zou dit nooit een auto_increment kolom mogen zijn.
Want?

Acties:
  • 0 Henk 'm!

  • Cyphax
  • Registratie: November 2000
  • Laatst online: 09:34

Cyphax

Moderator LNX
Merethil schreef op woensdag 04 mei 2016 @ 13:44:
[...]


IDENTITY(3924885, 1)?
Het lijkt me op zich dat als je bijvoorbeeld van je ID ook direct een klantnummer wilt maken
Hoewel ik dat enerzijds begrijp denk ik/ben ik van mening dat het beter is om die koppeling in elk geval niet "hard" te maken. :)

Dan heb je ook veel meer vrijheid om klantnummers te genereren die iets complexer zijn dan alleen een volgnummer of je begint bij 10.000.000, maar dan kan je de technische implementatie van je DB daar verder buiten laten.

Saved by the buoyancy of citrus


Acties:
  • 0 Henk 'm!

  • Merethil
  • Registratie: December 2008
  • Laatst online: 11-10 20:24
Cyphax schreef op woensdag 04 mei 2016 @ 13:59:
[...]

Hoewel ik dat enerzijds begrijp denk ik/ben ik van mening dat het beter is om die koppeling in elk geval niet "hard" te maken. :)

Dan heb je ook veel meer vrijheid om klantnummers te genereren die iets complexer zijn dan alleen een volgnummer of je begint bij 10.000.000, maar dan kan je de technische implementatie van je DB daar verder buiten laten.
Meh, je zou altijd nog een identity insert kunnen doen. Of gewoon een extra kolom hebben waar je klantnummergegevens aan toe kan voegen zodat je iets krijgt als 20184091 ABC, verdeeld over twee kolommen. Als je gewoon een uniek volgnummer voor je klant wilt zie ik weinig foutiefs in het gebruik van een AI-ID kolom.
(Grote systemen als SAP doen dit trouwens ook al duizend jaar, behalve dat je zelf het eerste getal aan kan geven bij initiële opzet van je klantgroep , waardoor je kan zeggen "klantgroep A begint bij 800000 terwijl klantgroep B begint bij 900000. Nodig? Nah. Handig? Meh. Simpel? Zeker.)

[ Voor 15% gewijzigd door Merethil op 04-05-2016 14:02 ]


Acties:
  • 0 Henk 'm!

  • Cyphax
  • Registratie: November 2000
  • Laatst online: 09:34

Cyphax

Moderator LNX
Merethil schreef op woensdag 04 mei 2016 @ 14:01:
[...]


Meh, je zou altijd nog een identity insert kunnen doen. Of gewoon een extra kolom hebben waar je klantnummergegevens aan toe kan voegen zodat je iets krijgt als 20184091 ABC, verdeeld over twee kolommen. Als je gewoon een uniek volgnummer voor je klant wilt zie ik weinig foutiefs in het gebruik van een AI-ID kolom.
Nee, niet zolang je niet van die eisen krijgt als "maar ik wil geen gaten he". :)

Je klantnummer verdelen over twee kolommen... tja het kan wel, maar ik denk dat je meer voordeel haalt uit een tweede kolom waar je de numerieke waarde van je primary key dan in zet, al was het maar om niet nodeloos je queries ingewikkelder te maken dan nodig. :)
(Grote systemen als SAP doen dit trouwens ook al duizend jaar, behalve dat je zelf het eerste getal aan kan geven bij initiële opzet van je klantgroep , waardoor je kan zeggen "klantgroep A begint bij 800000 terwijl klantgroep B begint bij 900000. Nodig? Nah. Handig? Meh. Simpel? Zeker.)
Tja, SAP, ik weet niet of je daar je inspiratie vandaan moet halen... ;)

[ Voor 10% gewijzigd door Cyphax op 04-05-2016 14:10 ]

Saved by the buoyancy of citrus


Acties:
  • 0 Henk 'm!

  • Merethil
  • Registratie: December 2008
  • Laatst online: 11-10 20:24
Cyphax schreef op woensdag 04 mei 2016 @ 14:07:
[...]

Nee, niet zolang je niet van die eisen krijgt als "maar ik wil geen gaten he". :)

Je klantnummer verdelen over twee kolommen... tja het kan wel, maar ik denk dat je meer voordeel haalt uit een tweede kolom waar je de numerieke waarde van je primary key dan in zet, al was het maar om niet nodeloos je queries ingewikkelder te maken dan nodig. :)

[...]

Tja, SAP, ik weet niet of je daar je inspiratie vandaan moet halen... ;)

Ik weet niet zeker of MySQL hetzelfde werkt als MSSQL op dit gebied, maar: als je ergens in het midden van je data wil inserten en betrokken pages zitten vol, dan mag je DBMS aan de bak om de boel opnieuw te organiseren en dat is zonde, want dat is nergens voor nodig. :)
Identity insert is ook geen dingetje wat je graag doet, maar als het écht móet omdat iemand moeilijk loopt te doen is het in ieder geval mogelijk. :P
Verdelen over twee kolommen maakt je query nou niet zó veel moeilijker natuurlijk. Eventueel kan je een composite key creëeren, maar weet niet of je dan één AI en de ander non-AI kan maken, waarbij je de tweede kolom los moet invullen in je CRM wanneer je een klant "aanmaakt".

Even terzijde: Als je je numerieke waarde in die tweede kolom wilt gaan neerzetten samen met wat andere data heb je dus wel dat je voor elke insert meerdere queries gaat lopen doen: Insert, get ID, update tweede kolom met ID+zelfingevoerdewaarde. Ik denk dat dat een nog slechter idee is :P

SAP is inderdaad totaal geen goeie bron van inspiratie, maar 't is wel de "goto" voor veel business users die zeggen "ja maar SAP doet het zo en als de nummer 1 het zo doet dan...". Tja.

[ Voor 9% gewijzigd door Merethil op 04-05-2016 14:13 ]


Acties:
  • 0 Henk 'm!

  • Cyphax
  • Registratie: November 2000
  • Laatst online: 09:34

Cyphax

Moderator LNX
Merethil schreef op woensdag 04 mei 2016 @ 14:11:
[...]

Identity insert is ook geen dingetje wat je graag doet, maar als het écht móet omdat iemand moeilijk loopt te doen is het in ieder geval mogelijk. :P

Verdelen over twee kolommen maakt je query nou niet zó veel moeilijker natuurlijk. Eventueel kan je een composite key creëeren, maar weet niet of je dan één AI en de ander non-AI kan maken, waarbij je de tweede kolom los moet invullen in je CRM wanneer je een klant "aanmaakt".

Even terzijde: Als je je numerieke waarde in die tweede kolom wilt gaan neerzetten samen met wat andere data heb je dus wel dat je voor elke insert meerdere queries gaat lopen doen: Insert, get ID, update tweede kolom met ID+zelfingevoerdewaarde. Ik denk dat dat een nog slechter idee is :P
Yes, je snapt denk ik wel waarom ik mijn eerste reactie maar kort hield: om dit traject te voorkomen want ik ben er zo vaak geweest ooit. :P
Ik blijf erbij dat dat het beste is, enige uitzondering is voor ons speculatie, gezien TS na z'n TS niet meer gereageerd heeft :P

Saved by the buoyancy of citrus


Acties:
  • 0 Henk 'm!

  • Merethil
  • Registratie: December 2008
  • Laatst online: 11-10 20:24
Cyphax schreef op woensdag 04 mei 2016 @ 14:27:
[...]

Yes, je snapt denk ik wel waarom ik mijn eerste reactie maar kort hield: om dit traject te voorkomen want ik ben er zo vaak geweest ooit. :P
Ik blijf erbij dat dat het beste is, enige uitzondering is voor ons speculatie, gezien TS na z'n TS niet meer gereageerd heeft :P
Ik heb het zelf nooit meegemaakt aangezien ik eigenlijk nooit werk doe voor websites/applicaties waar gebruikers in zitten. Het hele systeem waar ik aan werk is volledige middleware magie en dus ziet geen enkele business user er iets van; vandaar vond ik de discussie ook wel even interessant en was mijn "Want?"-post een half uurtje geleden dus een daadwerkelijke vraag: Waarom zou het zo'n probleem zijn?

Maar goed, niet de plaats om die discussie te houden. Ik gok dat TS meer dan genoeg info heeft gehad om te weten dat hij niet moet gaan lopen klooien met AI "fixen" als het echt niet nodig is.

Acties:
  • +1 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Merethil schreef op woensdag 04 mei 2016 @ 14:34:
Ik gok dat TS meer dan genoeg info heeft gehad om te weten dat hij niet moet gaan lopen klooien met AI "fixen" als het echt niet nodig is.
...en nodig is het nooit. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
Sowieso is het verwijderen van rows in een database verdacht. Een kolom "inactive" is veel beter. Maar met klanten? Je hebt hooguit een "lastOrderDate", en een "ActiveCustomers" view die selecteert op "lastOrderDate > today - 365".

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Acties:
  • 0 Henk 'm!

  • BCC
  • Registratie: Juli 2000
  • Laatst online: 11-10 20:25

BCC

MSalters schreef op woensdag 04 mei 2016 @ 16:47:
Sowieso is het verwijderen van rows in een database verdacht. Een kolom "inactive" is veel beter. Maar met klanten? Je hebt hooguit een "lastOrderDate", en een "ActiveCustomers" view die selecteert op "lastOrderDate > today - 365".
Met de komende privacy wetgeving, gaat binnenkort toch echt heel anders moeten ben ik bang :)

Na betaling van een licentievergoeding van €1.000 verkrijgen bedrijven het recht om deze post te gebruiken voor het trainen van artificiële intelligentiesystemen.


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Hoeft niet, je hebt nog altijd de optie om alle identificerende kolommen als voornaam, achternaam etc een anonieme waarde te geven en je DB compleet te houden.

Anyway, het is afhankelijk van de usecase of verwijderen correct en toegestaan is. Als dat niet zo is, weet je dat hopelijk wel en vage subjectieve dingen als 'maar persoon x vindt het niet heel mooi als een nummertje mist' zijn daar hopelijk aan ondergeschikt.

[ Voor 45% gewijzigd door Voutloos op 04-05-2016 17:04 ]

{signature}


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Voutloos schreef op woensdag 04 mei 2016 @ 17:02:
Hoeft niet, je hebt nog altijd de optie om alle identificerende kolommen als voornaam, achternaam etc een anonieme waarde te geven en je DB compleet te houden.
Compleet offtopic hier, maar moet je facturen niet altijd opnieuw kunnen aanbieden in dezelfde vorm als ze in de eerste instantie zijn aangemaakt? Dan kom je toch niet weg met het verwijderen of anonimiseren van die gegevens?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • ThomasG
  • Registratie: Juni 2006
  • Laatst online: 23-09 14:00
NMe schreef op woensdag 04 mei 2016 @ 17:07:
[...]

Compleet offtopic hier, maar moet je facturen niet altijd opnieuw kunnen aanbieden in dezelfde vorm als ze in de eerste instantie zijn aangemaakt? Dan kom je toch niet weg met het verwijderen of anonimiseren van die gegevens?
Je moet ze voor de fiscus in ieder geval een x-aantal jaar bewaren, met daarbij de correcte prijzen, naam, etc. Wanneer je de klantgegevens in de database anonimiseert, zullen de facturen een andere manier bewaard moeten worden. Bijvoorbeeld als PDF.

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Eigen voorkeur is om uberhaupt direct de PDFs op te slaan. Storage is goedkoop, zeker tov allemaal logica geneuzel en gezeik of je ze op later punt voldoende hetzelfde renderen kan. :)

{signature}


Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
NMe schreef op woensdag 04 mei 2016 @ 17:07:
[...]

Compleet offtopic hier, maar moet je facturen niet altijd opnieuw kunnen aanbieden in dezelfde vorm als ze in de eerste instantie zijn aangemaakt? Dan kom je toch niet weg met het verwijderen of anonimiseren van die gegevens?
Gewoon voor die reden opslaan als ps/pdf.

Anders ga je overal en alles moeten versioneren en mijn ervaring is dat dat op een heleboel plekken gewoon niet gebeurt.
Ik wil me niet druk hoeven maken of een belastingdienst nou valt over het feit dat het logo veranderd is in die 7 jaar, of we een ander formaat papier zijn gaan gebruiken of niet etc. etc. etc.

Ik wil gewoon tegen de BD kunnen zeggen : Kijk hier, dit is hoe de printer ze aangeboden kreeg veel plezier ermee.

Acties:
  • +1 Henk 'm!

Verwijderd

Topicstarter
Jullie hebben mij niet zo goed begrepen denk ik, ik weet net hoe ik dingen in een database kan toevoegen en verwijderen maar wat jullie me allemaal zeggen snap ik de pleuris niet van, een uitleg bij een antwoord zou fijn zijn! En vele zeggen dat wat ik wil onzin is, nou dat is het niet omdat ik niet regel 1 wil hebben en dan opeens regel 4 omdat regel 2 en 3 verwijderd zijn. Ik hoop dat jullie me snappen.

Acties:
  • +4 Henk 'm!

  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

Dat snappen we. En we zeggen dat je je daar niet mee bezig moet houden.

Wat zou je bijvoorbeeld doen als je rij 1, 2, 3, 4, en 5 hebt, en rij 2 wordt weggehaald? Rijen 3, 4, en 5 eentje opschuiven? Wat als er, terwijl je dat aan het doen bent, nog een rij wordt toegevoegd? Dan krijg je rijen 1-4 en 6 zonder 't door te hebben. Ondertussen heb je wel je teller aangepast om '5' neer te zetten dus dat gaat 1x goed en dan bij de volgende insert heb je 2x rij 6.

Die id nummers zijn alleen maar om een rij te identificeren. Je moet er geen waarde aan koppelen anders dan dat.

[ Voor 10% gewijzigd door CyBeR op 17-05-2016 02:22 ]

All my posts are provided as-is. They come with NO WARRANTY at all.


Acties:
  • 0 Henk 'm!

  • Radiant
  • Registratie: Juli 2003
  • Niet online

Radiant

Certified MS Bob Administrator

Als het puur voor de weergave is en je dan echt zo graag een opvolgend regelnummer voor je results wil, waarom print je dat er dan niet voor in je uitvoer en laat je de PK weg?

(geen garantie dat dat een microseconde na het laden van de pagina nog hetzelfde is, maar dat probleem heb je ook als je zo met je PK's gaat klooien)

Acties:
  • +1 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 08:49

Janoz

Moderator Devschuur®

!litemod

Verwijderd schreef op dinsdag 17 mei 2016 @ 02:13:
En vele zeggen dat wat ik wil onzin is, nou dat is het niet omdat ik niet regel 1 wil hebben en dan opeens regel 4 omdat regel 2 en 3 verwijderd zijn. Ik hoop dat jullie me snappen.
En toch is het onzin. Je probleem is echter dat je 'regel' en 'identifier' door elkaar haalt. Het ID (wat middels de autoincrement gegarandeerd uniek is) is bedoeld om altijd hetzelfde record terug te krijgen wanneer je hetzelfde ID opvraagt. Dat zou dus nooit moeten veranderen. Je moet er daarom ook geen andere betekenissen aan geven.

Regelnummers zijn pas relevant wanneer je je resultaten onder elkaar gaat zetten. Het verwijderen van een record veranderd de regelnummers, maar als je anders gaat sorteren of gaat filteren zijn de regelnummers ook anders. Die zul je dus eigenlijk pas weer moeten geven wanneer je de resultaten afdrukt. Dat is namelijk pas het moment waarop je weet wat het regelnummer is.

Om met een ander voorbeeld te komen: Wanneer er iemand dood gaat, dan verandert toch ook niet het BSN van alle mensen die na hem geboren zijn?

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


Acties:
  • 0 Henk 'm!

  • Cyphax
  • Registratie: November 2000
  • Laatst online: 09:34

Cyphax

Moderator LNX
Verwijderd schreef op dinsdag 17 mei 2016 @ 02:13:
En vele zeggen dat wat ik wil onzin is, nou dat is het niet omdat ik niet regel 1 wil hebben en dan opeens regel 4 omdat regel 2 en 3 verwijderd zijn. Ik hoop dat jullie me snappen.
Hmm, ik twijfel over dat laatste. Gaat het nou alleen maar over het idee dat, wanneer je in de database gaat kijken, je gaten ziet, of geeft dat ook echt problemen ergens? Met andere woorden: is het praktisch gezien een probleem of gaat het alleen om gevoel?

Als het om dat laatste gaat, dan is er maar één goed advies: laat het gaan. Het is de moeite allemaal niet waard (en met moeite bedoel ik dat je je product technisch slechter of langzamer gaat maken terwijl het in de praktijk niets oplost of verbetert). Kijk gewoon niet in de database, die regelt alles voor jou op dat gebied en die ligt er al niet wakker van. We hebben het beste met je voor. ;)

Als het praktisch gezien een probleem is of cosmetisch voor je gebruikers, dan hebben we dat niet goed begrepen, maar dat kan ik niet opmaken uit het topic.

Saved by the buoyancy of citrus


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Cyphax schreef op dinsdag 17 mei 2016 @ 10:11:
[...]

Hmm, ik twijfel over dat laatste. Gaat het nou alleen maar over het idee dat, wanneer je in de database gaat kijken, je gaten ziet, of geeft dat ook echt problemen ergens? Met andere woorden: is het praktisch gezien een probleem of gaat het alleen om gevoel?

Als het om dat laatste gaat, dan is er maar één goed advies: laat het gaan. Het is de moeite allemaal niet waard (en met moeite bedoel ik dat je je product technisch slechter of langzamer gaat maken terwijl het in de praktijk niets oplost of verbetert). Kijk gewoon niet in de database, die regelt alles voor jou op dat gebied en die ligt er al niet wakker van. We hebben het beste met je voor. ;)

Als het praktisch gezien een probleem is of cosmetisch voor je gebruikers, dan hebben we dat niet goed begrepen, maar dat kan ik niet opmaken uit het topic.
Het is voor wij als admins want kijk, ik kan wel een counter doen die elke keer een omhoog gaat maar dan kan een admin niet zien welke id nou daadwerkelijk die regel is, en kan je die regel dus niet verwijderen via mijn admin paneel want daar moet je de id van de regel neerzetten en die kan je dan verwijderen. Ook staat het gewoon niet mooi als je op de pagina regel 4 ziet en dan opeens regel 7 omdat regel 5 en 6 dan zijn verwijderd

Acties:
  • +1 Henk 'm!

  • Rmg
  • Registratie: November 2003
  • Laatst online: 08:48

Rmg

code:
1
2
3
4
5
SELECT @n := @n + 1 n,
       first_name, 
       last_name
  FROM table1, (SELECT @n := 0) m
 ORDER BY last_name


Je kan zoiets doen, laat je auto increment gewoon met rust, genereer er dynamisch een ID bij.

Acties:
  • 0 Henk 'm!

  • Cyphax
  • Registratie: November 2000
  • Laatst online: 09:34

Cyphax

Moderator LNX
Verwijderd schreef op vrijdag 03 juni 2016 @ 10:19:
[...]


Het is voor wij als admins want kijk,
We gaan kijken. :)
ik kan wel een counter doen die elke keer een omhoog gaat maar dan kan een admin niet zien welke id nou daadwerkelijk die regel is, en kan je die regel dus niet verwijderen via mijn admin paneel want daar moet je de id van de regel neerzetten en die kan je dan verwijderen.
Ook staat het gewoon niet mooi als je op de pagina regel 4 ziet en dan opeens regel 7 omdat regel 5 en 6 dan zijn verwijderd
Ik heb die primary key eerder eens "betekenisloze sleutel" genoemd omdat het idee erachter is dat je een iets hebt om die rij te identificeren maar dat dat iets verder eigenlijk niets betekent. Ik zou mijzelf kunnen identificeren aan de hand van mijn BSN, maar dat nummer zegt verder helemaal niks over mij (misschien zou je er, net als bij kentekens van auto's, een grove inschatting van mijn leeftijdscategorie mee kunnen maken, maar dat terzijde).
Je wil nu een daadwerkelijke eigenschap toevoegen aan een row met een betekenis. Die zou ik dan toevoegen als kolom en programmatisch (dat kan zijn via een sp of trigger die je gebruikt voor je deletes en je inserts, of in je backend-code, 'k weet niet wat je het liefst doet) bijwerken. Dan reduceer je het werk voor je database denk ik het meest tot het bijwerken van een serie nummers in een reeks rijen vanaf de rij die je verwijderd hebt. In je adminpaneel moet je dan wél kunnen sorteren op een kolom naar jouw keuze, want anders wordt het lastiger. Ik hoop dat je adminpaneel uiteindelijk niet de doorslag gaat geven over de technische implementatie, al begrijp ik je wens goed, want een onbruikbaar adminpaneel, daar zit je toch ook maar mooi mee.

[edit]
Of een computed kolom zoals Rmg voorstelt, dat is ook wel elegant. Misschien kan je dat nog mooi verpakken in een view. :)

[ Voor 8% gewijzigd door Cyphax op 03-06-2016 10:33 ]

Saved by the buoyancy of citrus


Acties:
  • 0 Henk 'm!

  • Radiant
  • Registratie: Juli 2003
  • Niet online

Radiant

Certified MS Bob Administrator

Verwijderd schreef op vrijdag 03 juni 2016 @ 10:19:
[...]


Het is voor wij als admins want kijk, ik kan wel een counter doen die elke keer een omhoog gaat maar dan kan een admin niet zien welke id nou daadwerkelijk die regel is, en kan je die regel dus niet verwijderen via mijn admin paneel want daar moet je de id van de regel neerzetten en die kan je dan verwijderen. Ook staat het gewoon niet mooi als je op de pagina regel 4 ziet en dan opeens regel 7 omdat regel 5 en 6 dan zijn verwijderd
Je moet een ID handmatig invullen? Is de oplossing dan niet gewoon een linkje naast de regel plaatsen naar een delete-pagina waar je de ID gewoon in de query string meestuurt? 8)7

Acties:
  • 0 Henk 'm!

  • Merethil
  • Registratie: December 2008
  • Laatst online: 11-10 20:24
Radiant schreef op vrijdag 03 juni 2016 @ 10:31:
[...]

Je moet een ID handmatig invullen? Is de oplossing dan niet gewoon een linkje naast de regel plaatsen naar een delete-pagina waar je de ID gewoon in de query string meestuurt? 8)7
Dit. En als je echt een lijstje met oplopende nummers wilt hebben kan je toch gewoon dit doen:

HTML:
1
<a href="/destroy/{idVanDeRijDieIkWilVerwijderen}">{nummertjeInDeTabelDieIkZelfVerzonnenHeb}</a>


?
Dit is hoe de meeste systemen werken, alleen laten ze vaak gewoon het ID zien als representatie in de frontend omdat de meeste mensen niet zo'n problemen hebben met missende getallen.

Acties:
  • +1 Henk 'm!

  • DJMaze
  • Registratie: Juni 2002
  • Niet online
Verwijderd schreef op dinsdag 17 mei 2016 @ 02:13:
Jullie hebben mij niet zo goed begrepen denk ik, ik weet net hoe ik dingen in een database kan toevoegen en verwijderen maar wat jullie me allemaal zeggen snap ik de pleuris niet van, een uitleg bij een antwoord zou fijn zijn! En vele zeggen dat wat ik wil onzin is, nou dat is het niet omdat ik niet regel 1 wil hebben en dan opeens regel 4 omdat regel 2 en 3 verwijderd zijn. Ik hoop dat jullie me snappen.
Goed, snap je dan wel het volgende:


Persoon A ziet de pagina als volgt:
code:
1
2
1. Hendrik
2. Pieter


Persoon B ziet de pagina als volgt:
code:
1
2
1. Hendrik
2. Pieter


Nu verwijderd Persoon A "1" uit de database, en ziet:
code:
1
1. Pieter


Nu verwijderd Persoon B "1" uit de database, en ziet:
code:
1


Persoon B denkt "Ik heb Hendrik verwijderd, iemand anders heeft Pieter verwijderd".
Persoon B vraagt aan Persoon A: "Heb jij Pieter verwijderd? Ik heb die persoon nodig".
Persoon A: "Ik was het niet, ik heb Herman verwijderd"
Persoon B: "Ja ik heb ook Herman verwijderd, weird 8)7 "


Persoonlijk: ik zou gewoon nooit een nummertje tonen als het niet relevant is.
Factuurnummer is geen ID (wel oplopend, maar hoeft geen ID te zijn)
Klantnummer, ja dat kan een ID zijn, mag je toch nooit aanpassen.
etc. etc.
Bedenk goed wat je met je laatste rolo nummer doet!

[ Voor 45% gewijzigd door DJMaze op 03-06-2016 12:13 ]

Maak je niet druk, dat doet de compressor maar


Acties:
  • 0 Henk 'm!

  • emnich
  • Registratie: November 2012
  • Niet online

emnich

kom je hier vaker?

Verwijderd schreef op vrijdag 03 juni 2016 @ 10:19:
[...]


Het is voor wij als admins want kijk, ik kan wel een counter doen die elke keer een omhoog gaat maar dan kan een admin niet zien welke id nou daadwerkelijk die regel is, en kan je die regel dus niet verwijderen via mijn admin paneel want daar moet je de id van de regel neerzetten en die kan je dan verwijderen. Ook staat het gewoon niet mooi als je op de pagina regel 4 ziet en dan opeens regel 7 omdat regel 5 en 6 dan zijn verwijderd
Wat hier gezegd wordt is dat je die ID in principe nooit nodig hebt als gebruiker en nooit hoeft te zien. Die ID is er puur en alleen voor de database.

Ik zou sowieso niet iets maken waar je even een ID invult om het te verwijderen. Waarom niet een link/knop/... waar je op kan drukken. Heb je ook geen kans op typos.

Acties:
  • 0 Henk 'm!

  • ajakkes
  • Registratie: Maart 2004
  • Laatst online: 16-05 22:32

ajakkes

👑

Persoon A en B openen het paneel.
Persoon A verwijderd regel 2.
Persoon C opent het paneel en vraagt aan B of regel 2 goed is. Persoon B zegt die zou ik verwijderen en persoon C verwijderd regel 2. Persoon B ziet de volgende keer dat hij kijkt dat regel 3 inmiddels ook weg is. Oeps.

Waarvoor wil je het regel nummer weergeven en niet een auto incr ID?

Ik weet, het ziet er de eerste week een beetje vreemd uit. Maar na 3 maanden wil je niks anders meer. En je kan ze ook beide tonen.

👑

Pagina: 1