Door
Brecht S
op 31-12-2014 10:13
gewijzigd op 31-12-2014 10:23
4.141 views
Ik weet dat dit topic al overal te vinden is maar kom niet aan een passende oplossing toe.
Dus ik wil factuurnummers automatisch laten verhogen maar dat kan niet met een auto-increment omdat ik die al gebruik voor mijn id field. Blijkbaar kan ik geen twee keer een auto-increment doen in dezelfde tabel?
Ik heb dus een tabel facturen met volgende velden:
ID titel aantal omschrijving e_prijs tot factnr
1 Test1 1 Testfactuur 1 100 100 ?
2 Test2 3 Testfactuur 2 100 200 ?
Hoe vul ik nu het beste de ? in? Met welke query?
Het formaat zou moeten 2015/001/VF zijn. Waarbij 2015 het jaar, 001 (moet telkens verhoogd worden met 1) het factnr zelf en VF zou moeten staan voor voorschotfactuur maar dit kan evengoed TF = tussentijdse factuur, RF = regie factuur, SF = slotfactuur.
Nice, maar als je toch een aparte tabel gaat toevoegen, dan kun je ook die ook gebruiken voor de facturen mét AUTO_INCREMENT op de primaire sleutel voor het volgnummer?
Om het niet ingewikkelder te maken dan het is: het volgende factuurnummer kun je berekenen met een (sub)query zoals SELECT GREATEST(invoice_number) + 1 AS next_invoice_number.
Mee eens, echter dergelijke SQL vraagt vrijwel altijd een full table scan wat bij duizenden of miljoenen records impact heeft op de performance. Met name daarom heeft bijvoorbeeld Oracle de "Sequence" bedacht die (configureerbaar) gecashed kan worden in memory dat dan weer om hotspot performance issues te voorkomen. UIteraard is mijn MySQL oplossing een simpele en op die manier dan weer een hotspot kandidaat.
FROM DUAL betekent dat je niet uit een tabel selecteert, en kan in MySQL achterwege worden gelaten.
Omdat de combinatie inv_year en inv_seq per definitie uniek moet zijn, kan je daar een samengestelde primary key van maken. Een aparte primary key met auto_increment heeft hier geen enkele zin.
Voor ik het straks vergeet: iedereen hier (en speciaal voor diegenen die mij de laatste uren van dit jaar nog helpen met een probleem) een goed oud naar nieuw gewenst!
FROM DUAL betekent dat je niet uit een tabel selecteert, en kan in MySQL achterwege worden gelaten.
DUAL is bedacht door Oracle en is daadwerkelijk een tabel met 1 record en 1 attribuut met inhoud "X". Gebruikt voor pseudocolumn selecties als
select 1024*8 from dual
select username from dual
select sysdate from dual
@Ger: jouw query werkt perfect maar als de inv_seq nummer 10 is gemaakt gaat hij niet meer verhogen met +1 De nummer blijft op 10 staan, we krijgen dus geen 11, enz...
Wat ik wel zie is dat als ik in mysql INT meegeef aan die kolom het wel werkt maar bij VARCHAR niet. Hoe komt dit?
Het is al vreemd dat het pas na de 10 gebeurd. Met strings kan je niet rekenen. Dus moet je int gebruiken.
Nu zal je jezelf afvragen hoe je dan die voorloop nullen krijgt, in mysql is dat super eenvoudig:
ALTER TABLE invoices
CHANGE COLUMN inv_seq inv_seq SMALLINT(5) ZEROFILL NOT NULL
Dit zorgt ervoor dat je altijd minimaal 5 digits te zien krijgt, dus 123 wordt 00123.
Dat is interessant om weten. Ik had die voorloopnullen er manueel bijgezet (in de output als het factuurnummer is weergegeven), maar is beter als die al in de db zitten.
Thanks.