Buitenlandse sleutels bieden referentiële integriteit. De gegevens in een externe-sleutelkolom worden gevalideerd - de waarde kan slechts een waarde zijn die al bestaat in de tabel en kolom die zijn gedefinieerd in de externe sleutel. Het is zeer effectief bij het stoppen van "slechte gegevens" - iemand kan niet invoeren wat ze willen - cijfers, ASCII-tekst, enz. Het betekent dat de gegevens zijn genormaliseerd - herhalende waarden zijn geïdentificeerd en geïsoleerd in hun eigen tabel, dus er zijn geen zorgen meer over het omgaan met hoofdlettergevoeligheid in tekst... en de waarden zijn consistent. Dit leidt naar het volgende deel - buitenlandse sleutels zijn wat je gebruikt om tabellen samen te voegen.
Uw zoekopdracht voor de projecten die een gebruiker heeft, zou niet werken - u verwijst naar een kolom uit de USERS
tabel wanneer er geen verwijzing naar de tabel in de query is en er geen subquery wordt gebruikt om die informatie op te halen voordat deze wordt gekoppeld aan de PROJECTS
tafel. Wat je echt zou gebruiken is:
SELECT p.*
FROM PROJECTS p
JOIN USERS u ON u.user_id = p.creator
WHERE u.username = 'John Smith'