Omdat ik veel met transactions werk heb ik in een MySQL-database gekozen voor INNODB-tabellen (MyISAM ondersteunt namelijk geen transactions).
In deze database bevindt zich een tabel 'klanten'. Deze tabel bevat 'klanten' voor meerdere 'bedrijven':
Een belangrijke eis van de opdrachtgever is dat het KlantId oploopt per BedrijfId (VAN DEZE EIS MAG NIET WORDEN AFGEWEKEN). Hiervoor moet dus een multiple-column primary key aangemaakt worden, met een auto_increment op de KlantId-column:
Probleem is hierbij dat INNODB een auto_increment in een multiple-column key situatie niet ondersteunt... Hierom heb ik het volgende uitgedacht bij de inserts:
Het lijkt te werken op deze manier, vind de query alleen nogal groot. Ik heb een aantal vragen:
1. Volgens mij is de snelheid niet (veel) lager dan in een MyISAM situatie met auto_increment (Volgens mij wordt er met auto_increment namelijk altijd een MAX(Id) query uitgevoerd op de achtergrond). Zijn jullie dit met me eens?
2. Is er een efficientere manier?
3. Dek ik alles af wat betreft locking? Ook in multi-user situaties?
In deze database bevindt zich een tabel 'klanten'. Deze tabel bevat 'klanten' voor meerdere 'bedrijven':
| BedrijfId | KlantId |
Een belangrijke eis van de opdrachtgever is dat het KlantId oploopt per BedrijfId (VAN DEZE EIS MAG NIET WORDEN AFGEWEKEN). Hiervoor moet dus een multiple-column primary key aangemaakt worden, met een auto_increment op de KlantId-column:
| BedrijfId | KlantId |
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 2 | 1 |
| 2 | 2 |
Probleem is hierbij dat INNODB een auto_increment in een multiple-column key situatie niet ondersteunt... Hierom heb ik het volgende uitgedacht bij de inserts:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| INSERT INTO klanten ( BedrijfId, KlantId ) SELECT [BedrijfId_Value], ( SELECT (CASE WHEN MAX(KlantId) <> 'NULL' THEN MAX(KlantId) ELSE '0' END) + 1 FROM klanten WHERE BedrijfId = [BedrijfId_Value] FOR UPDATE ) ; |
Het lijkt te werken op deze manier, vind de query alleen nogal groot. Ik heb een aantal vragen:
1. Volgens mij is de snelheid niet (veel) lager dan in een MyISAM situatie met auto_increment (Volgens mij wordt er met auto_increment namelijk altijd een MAX(Id) query uitgevoerd op de achtergrond). Zijn jullie dit met me eens?
2. Is er een efficientere manier?
3. Dek ik alles af wat betreft locking? Ook in multi-user situaties?