Toon posts:

[MySQL] Autonummering

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

Verwijderd

Topicstarter
Ik ben bezig met het maken van een klein orderpakket in PHP / MySQL.
Ik heb een tabel met Orders, hierin staat klant informatie, orderdatum etc. Deze tabel heeft als uniek ik OrderID.

Voor de orderregels heb ik een aparte tabel, hierin wordt het OrderID op geslagen en omschrijving, prijs etc. Deze tabel heeft ook een veld OrderregelID, dit is een auto_increment veld. De unieke sleutel in deze tabel is "OrderID, OrderregelID".

OrderID OrderregelID
1 1
1 2
1 3
2 1
3 1
3 2

Als ik een nieuwe order aanmaak en een orderregel toevoeg wordt in de orderregel tabel netjes met OrderregelID 1 begonnen. Het probleem is dat wanneer ik deze orderregel weer verwijder en een nieuwe toevoeg, dat er weer met OrderregelID 1 begonnen wordt, ik wil graag dat deze doornummer en niet elke keer weer opnieuw begint met nummeren.

Kan dit ook?

  • sjroorda
  • Registratie: December 2001
  • Laatst online: 16:06
Kan wel, is niet wenselijk: een auto-ID is puur bedoeld om een unieke key-value te hebben per record, en of dat nu 1, 2, 3 enz. is, of 98342, 43543, 2134, 767432, ..., maakt niets uit. Je kan het oplossen door zelf de ID mee te geven in je insert-query; deze kan je dan eerst uit de tabel halen met een SELECT MAX(orderID) FROM ...

Verwijderd

Topicstarter
Dat gaat helaas niet. Het gaat om de OrderregelID. Wanneer ik 5 orderregels heb toegevoegd dan is het hoogste orderregelid 5, volgend zal 6 worden. Dat gaat goed.

Maar als ik orderregel 5 verwijder en ik vraag dan de Max op, plus 1. Krijg ik weer orderregel 5, dat wil ik graag vermijden.

Verwijderd

Ik zou zeggen log zelf in een externe (kleine) tabel de waarde die je wilt behouden en verhoog deze met één als je een (order-)rij toevoegd en maak met behulp van die waarde steeds de key aan voor je nieuwe orderrijen.

  • thomaske
  • Registratie: Juni 2000
  • Laatst online: 22:14

thomaske

» » » » » »

Verwijderd schreef op donderdag 19 mei 2005 @ 09:10:
Maar als ik orderregel 5 verwijder en ik vraag dan de Max op, plus 1. Krijg ik weer orderregel 5, dat wil ik graag vermijden.
En waarom als ik vragen mag? Dan moet je de orderregel niet verwijderen maar een extra flag meegeven.

Brusselmans: "Continuïteit bestaat niet, tenzij in zinloze vorm. Iets wat continu is, is obsessief, dus ziekelijk, dus oninteressant, dus zinloos."


  • sjroorda
  • Registratie: December 2001
  • Laatst online: 16:06
Verwijderd schreef op donderdag 19 mei 2005 @ 09:10:
Dat gaat helaas niet. Het gaat om de OrderregelID. Wanneer ik 5 orderregels heb toegevoegd dan is het hoogste orderregelid 5, volgend zal 6 worden. Dat gaat goed.

Maar als ik orderregel 5 verwijder en ik vraag dan de Max op, plus 1. Krijg ik weer orderregel 5, dat wil ik graag vermijden.
Volgens mij zou dat juist WEL goed moeten gaan met de auto-increment? Wat je anders kan doen is ergens een last-order-number bijhouden. Maar je kan je ook afvragen of je ontwerp wel helemaal juist is, want als je ordernummers niet mag kwijtraken/overschrijven, mogen de orders zelf dan wel uit de DB verdwijnen, of moet je ze als backup toch behouden? In dat geval kan je het beste een nieuw veld 'deleted' of zo toevoegen dat je op TRUE zet als de order verwijderd is.

Verwijderd

Topicstarter
Ik had gehoopt dat wat ik wou op te lossen was in MySQL zelf, maar dat is niet anders. Ik ga denk ik de oplossing met een 'flag' maar toepassen. Op deze manier hou ik ook mooi een historie bij.

Bedankt!

  • ReallyStupidGuy
  • Registratie: Januari 2002
  • Laatst online: 01-05 10:31
Wel heel raar dat een generator zijn waarde aanpast als de laatst toegevoegde record wordt verwijderd. Tenminste, dat lijkt mij wat je bedoeld. (zolang id 4 niet weer beschikbaar wordt als er al een id 5 bestaat bijvoorbeeld).
Ik weet niet waarom je de OrderregelID opslaat en niet bv. een sleutel gebruikt als OrderID, ProductID maar wat je hier doet is een generator voor een verkeerd doel gebruiken, de generator is eigenlijk bedoeld om unieke sleutels aan een record te geven en niet om in een gecombineerde sleutel te gebruiken, wat je dus zou krijgen is:
code:
1
2
3
4
5
6
orderid     orderregelid
1                       1
1                       2
1                       3
2                       4
2                       5

waardoor de orderid in de sleutel eigenlijk overbodig wordt. Als je orderregelid wilt gebruiken om bijvooorbeeld de volgorde van de regels vast te leggen zou je dat misschien met een insert trigger kunnen doen, iets van:
code:
1
2
3
4
select max(orderregelid) from orderregels
where orderid = :orderid
into :hoogste;
new.orderregelid = hoogste+1;

(dat is in de syntax van IB/firebird, ik ben niet echt bekend met MySQL maar zal wel ongeveer gelijk zijn?)

Duizend wijzen kunnen meer vragen stellen dan één idioot kan beantwoorden.

Pagina: 1