Stel je maakt in PostgreSQL een tabel "voertuig". Dit ding heeft een aantal atributen. Zijn key is bijvoorbeeld de integer "vid". Hieraan hang ik een PRIMARY KEY constraint (wat impliceert dat vid unique moet zijn). De default value van "vid" in "voertuig" is een nextval in een sequence.
Nu maak ik twee andere tabellen, "voertuig_auto" en "voertuig_bus". Deze twee tabellen maak ik inherent aan "voertuig". Zei erven dus alle attributen van "voertuig" over.
Tot dusver geen probleem. Maar nu komt er een derde tabel "lading" die een foreign key in "voertuig_bus" heeft. De key van voertuig bus erft hij echter over van zijn pappie en dus zegt "lading" dat hij "vid" in "voertuig_bus" niet kan vinden.
Dit is op zich al een probleem, maar het valt op te lossen. Ik maak voor iedere child een eigen kolom "vid" aan. Deze worden toch samengevoegd met de kolom uit de parent dus zoveel problemen levert dit niet op. Ik hang ook hier als default de nextval van de sequence van de parent aan.
"lading" is nu blij met zijn foreign key en als ik nu voegtuigen in beide child insert volgen de keys elkaar netjes op.
Ze gebruiken immers dezelfde sequence. Maar nu geeft ik het "vid" voor een nieuwe entry in "voertuig_auto" expliciet aan. Ik voeg bijvoorbeeld een record met het vid 10 toe. Daarna doe ik hetzelfde voor "voertuig_bus", ook met vid 10. Postgres hoort mij nu op de vingers te tikken want de parent krijgt 2 maal dezelfde waarde in een kolom waar een unique constraint aan hangt. Maar tot mijn verbazing doet Postgres dat helemaal niet.
Hij voert het record vrolijk in en bij een select * op voertuig krijg ik:
vid | kleur | eigenaar
------------------------------
1 | zwart | 1
10 | wit | 1
10 | blauw | 2
(3 rows)
Is dit een bug?
Hoe voorkom ik dit?
Nu maak ik twee andere tabellen, "voertuig_auto" en "voertuig_bus". Deze twee tabellen maak ik inherent aan "voertuig". Zei erven dus alle attributen van "voertuig" over.
Tot dusver geen probleem. Maar nu komt er een derde tabel "lading" die een foreign key in "voertuig_bus" heeft. De key van voertuig bus erft hij echter over van zijn pappie en dus zegt "lading" dat hij "vid" in "voertuig_bus" niet kan vinden.
Dit is op zich al een probleem, maar het valt op te lossen. Ik maak voor iedere child een eigen kolom "vid" aan. Deze worden toch samengevoegd met de kolom uit de parent dus zoveel problemen levert dit niet op. Ik hang ook hier als default de nextval van de sequence van de parent aan.
"lading" is nu blij met zijn foreign key en als ik nu voegtuigen in beide child insert volgen de keys elkaar netjes op.
vid | kleur | eigenaar
------------------------------
1 | zwart | 1
10 | wit | 1
10 | blauw | 2
(3 rows)
Is dit een bug?
Hoe voorkom ik dit?