Maak een tabel die zijn gegevens beschermt · oefening
Houd inventariscodes uniek
Als een materiaalruimte twee identieke accuboormachines heeft, mogen beide records prima de naam Cordless drill gebruiken. Hun inventariscodes hebben een andere taak: elke code moet naar één fysieke boormachine verwijzen. Stel je voor dat je TOOL-104 scant aan de uitleenbalie. SQLite mag het programma nooit laten kiezen tussen twee overeenkomende voorwerpen.
Dit hoort er te gebeuren wanneer het uitleenprogramma vier records probeert op te slaan:
id | asset_tag | name | Wat SQLite moet doen |
|---|---|---|---|
| 21 | TOOL-104 | Cordless drill | Opslaan |
| 22 | TOOL-105 | Cordless drill | Opslaan |
| 23 | TOOL-104 | Folding table | Weigeren |
| 24 | NULL | Projector | Weigeren |
Een herhaalde naam kan hier geen kwaad, maar bij een exact herhaalde inventariscode is niet meer te bepalen welk voorwerp die code identificeert.
Zoek de ontbrekende regel
Kijk voordat je iets wijzigt naar de huidige definitie in schema.sql:
asset_tag TEXT NOT NULL,
Die regel weigert het vierde record al omdat de code NULL is. Niets op de regel weigert echter het derde record. Voor het huidige schema is nog een TOOL-104 geen probleem.
Open schema.sql en voeg UNIQUE toe na NOT NULL, zodat de regel er zo uitziet:
asset_tag TEXT NOT NULL UNIQUE,
Laat de rest van de tabel staan zoals die is en druk op Run. Zoek de gewijzigde regel in de volledige definitie die SQLite afdrukt.
UNIQUE voegt een regel toe die voorkomt dat twee rijen dezelfde waarde in die kolom hebben. Hier beschermt het de koppeling tussen één inventariscode en één fysiek voorwerp. De twee rijen met Cordless drill zijn nog steeds toegestaan, omdat name die regel niet heeft.
Laat NOT NULL naast UNIQUE staan. De twee regels lossen verschillende problemen op: UNIQUE weigert een herhaalde code, terwijl NOT NULL een ontbrekende code weigert. Met alleen UNIQUE zou SQLite nog steeds meerdere NULL-waarden toestaan.
Deze regel onderschept exacte herhalingen. Met de gebruikelijke tekstvergelijking van SQLite zijn TOOL-104 en tool-104 verschillende waarden. Om hoofdletters en kleine letters in codes gelijk te behandelen, is nog een regel nodig. Dat doen we hier dus niet.
Kies Submit om de regel met nieuwe records te controleren. Dubbele namen met verschillende codes moeten werken; een herhaalde of ontbrekende code niet. Als een record zich anders gedraagt, ga dan terug naar de regel met asset_tag en controleer of zowel NOT NULL als UNIQUE er nog staat.
Je tabel kan nu een code weigeren die naar twee verschillende voorwerpen zou verwijzen, zonder twee voorwerpen te verbieden die toevallig dezelfde naam hebben. Dat is precies het onderscheid dat een inventariscode moet beschermen.
Opdracht
Open schema.sql en maak elke asset_tag uniek. Behoud de bestaande regel NOT NULL op die kolom.
Druk op Run en controleer of SQLite de volledige tabeldefinitie accepteert. Stuur daarna je schema in. Twee voorwerpen met verschillende codes mogen dezelfde naam hebben, maar een exact herhaalde code en een NULL-code moeten allebei worden geweigerd.