MySQL Primary Keys
Primary keys dienen als unieke identifiers voor de records in een tabel, terwijl foreign keys worden gebruikt om gerelateerde tabellen aan elkaar te koppelen. Bij het ontwerpen van een set databasetabellen is het belangrijk om te specificeren welke velden worden gebruikt voor primaire en vreemde sleutels om zowel de structuur van de tabel als de relaties tussen de tabellen te verduidelijken.
Priminaire sleutels
U kunt een primaire sleutel voor de tabel specificeren met de PRIMARY KEY constraint. In een goed ontworpen databaseschema fungeert een primaire sleutel als een onveranderlijke, unieke identificatie voor elk record. Als een sleutel als primair wordt gedeclareerd, betekent dit meestal dat de waarden in de sleutel zelden zullen worden gewijzigd.
De PRIMARY KEY constraint kan het best worden gezien als een combinatie van de NOT NULL en UNIQUE constraints, omdat het vereist dat waarden in het gespecificeerde veld noch NULL noch herhaald mogen worden in een andere rij. Beschouw het volgende voorbeeld, dat demonstreert door het numeriekeAirportID veld als de primaire sleutel voor de vliegveld tabel in te stellen.
mysql> CREATE TABLE airport ( -> AirportID smallint(5) unsigned NOT NULL, -> AirportCode char(3), -> AirportName varchar(255) NOT NULL, -> CityName varchar(255) NOT NULL, -> CountryCode char(2) NOT NULL, -> NumRunways INT(11) unsigned NOT NULL, -> NumTerminals tinyint(1) unsigned NOT NULL, -> PRIMARY KEY (AirportID) -> ) ENGINE=MYISAM;Query OK, 0 rows affected (0.05 sec)
In deze situatie, omdat het AirportID veld is gedefinieerd als de primaire sleutel, zal MySQL geen duplicatie of NULL waarden in dat veld toestaan. Dit stelt de database beheerder in staat om ervoor te zorgen dat elke luchthaven in de tabel een unieke numerieke waarde heeft, waardoor een hoge mate van consistentie van de opgeslagen gegevens wordt afgedwongen.
PRIMARY KEY constraints kunnen worden gespecificeerd voor een enkel veld of voor een samenstelling van meerdere velden. Beschouw het volgende voorbeeld, dat demonstreert door een tabel te construeren die een samengestelde primaire sleutel bevat:
mysql> CREATE TABLE flightdep ( -> FlightID SMALLINT(6) NOT NULL, -> DepDay TINYINT(4) NOT NULL, -> DepTime TIME NOT NULL, -> PRIMARY KEY (FlightID, DepDay, DepTime) -> ) ENGINE=MyISAM;Query OK, 0 rows affected (0.96 sec)
In dit geval staan de tabelregels herhaling toe van het vluchtnummer, de vertrekdag, of de vertrektijd, maar niet van alle drie samen. Kijk eens wat er gebeurt als je het probeert:
mysql> INSERT INTO flightdep (FlightID, DepDay, DepTime) -> VALUES (511,1,'00:01');Query OK, 1 row affected (0.20 sec)mysql> INSERT INTO flightdep (FlightID, DepDay, DepTime) -> VALUES (511,2,'00:01');Query OK, 1 row affected (0.00 sec)mysql> INSERT INTO flightdep (FlightID, DepDay, DepTime) -> VALUES (511,1,'00:02');Query OK, 1 row affected (0.00 sec)mysql> INSERT INTO flightdep (FlightID, DepDay, DepTime) -> VALUES (511,1,'00:01');ERROR 1062 (23000): Duplicate entry '511-1-00:01:00' for key 'PRIMARY'
Composite primary keys kunnen van pas komen als een record uniek moet worden geïdentificeerd door een combinatie van zijn attributen, in plaats van door slechts een enkel attribuut.