Hoe u Foreign Key-beperkingen in SQL kunt maken

epcdream.nl

Als u een onderneming heeft, moet u de waarde en behoefte aan gegevens in uw bedrijf zijn tegengekomen. De middelen hebben om databases op te slaan en te manipuleren, voegt meer waarde toe aan het bedrijf.

Databases zijn volgens een bepaalde conventie georganiseerd en stellen u in staat gegevens in verbanden te structureren, wat ons brengt bij relationele databases, die sinds de jaren zeventig zijn omarmd als een vorm van gegevensbeheer. En in de huidige markt hebben relationele databases de voorkeur vanwege hun mogelijkheden bij het manipuleren van gegevens.

Hoewel er veel beschikbare relationele databases zijn, heeft MySQL de leidende positie bereikt en staat het wereldwijd op nummer twee, volgens Statista, vanaf januari 2022.

In de SQL-server zijn beperkingen vooraf gedefinieerde regels en beperkingen die worden afgedwongen in een enkele of meerdere kolommen; ze zijn gekoppeld aan de waarden in de kolom en helpen bij het handhaven van de integriteit, nauwkeurigheid en betrouwbaarheid van de gegevens in de opgegeven kolommen.

Simpel gezegd, alleen gegevens die aan de beperkingsregel voldoen, worden met succes in de kolom ingevoegd. De invoegbewerking wordt beëindigd als de gegevens niet aan de criteria voldoen.

Dit bericht gaat ervan uit dat je relationele databases bent tegengekomen, met name MySQL, en je kijkt ernaar uit om je kennis in het domein te versterken. Uiteindelijk zal ik enkele tips delen voor interactie met Foreign key constraints.

Primaire sleutelbeperkingen – een samenvatting

Een tabel in SQL omvat een kolom of meerdere met sleutelwaarden die elke rij in de systemen nauwkeurig lokaliseren. De kolom of kolommen met de titel primaire sleutel (PK) van de tabel hebben de rol van het afdwingen van de entiteitsintegriteit van de tabel. Primaire sleutelbeperkingen garanderen unieke gegevens en worden vaak gedefinieerd op een identiteitskolom.

Na het specificeren van de primaire sleutelbeperkingen voor uw tabel, legt de database-engine automatisch gegevensuniek op door unieke indexen te genereren voor elk van de primaire kolommen. Primaire sleutels bieden een extreem voordeel bij gebruik in query’s door snelle gegevenstoegang te bieden.

Als primaire sleutelbeperkingen zijn gedefinieerd voor meerdere kolommen, wordt dit een samengestelde of samengestelde primaire sleutel genoemd. En in dit geval kan elke primaire sleutelkolom dubbele waarden bevatten. De gecombineerde waarden van alle kolommen in de primaire sleutel moeten echter uniek zijn.

Een goed voorbeeld is een geval waarin je een tabel hebt met de kolommen `id`, `names` en `age`. Wanneer u de primaire sleutelbeperking op de combinatie van `id` en `names` definieert, kunt u dubbele instanties van ofwel `id`- of `names`-waarden hebben. Toch moet elke combinatie uniek zijn om dubbele rijen te voorkomen. U kunt dus records hebben met `id=1` en `name=Walter`, en `age-22′ en `id=1`, `name=Henry` en `age=27`, maar u kunt geen andere records hebben met `id=1` en `name=Walter` omdat de combinatie niet uniek is.

Hier zijn enkele essentiële aspecten om te weten:

  • Een tabel bevat slechts één primaire sleutelbeperking.
  • Primaire sleutels mogen niet langer zijn dan 16 kolommen en mogen niet langer zijn dan 900 tekens.
  • De indexen die door primaire sleutels worden gegenereerd, kunnen die in de tabel verhogen. Het aantal geclusterde indexen in een tabel mag echter niet groter zijn dan 1 en het aantal niet-geclusterde indexen in een tabel is beperkt tot 999.
  • Wanneer geclusterd en niet-geclusterd niet zijn opgegeven voor een sleutelbeperking, wordt automatisch geclusterd genomen.
  • Alle kolommen die binnen een primaire sleutelbeperking zijn gedeclareerd, moeten worden gedefinieerd als niet null. Als dit niet het geval is, hebben alle kolommen die in de beperking zijn gekoppeld, hun nullability robotisch ingesteld op niet null.
  • Wanneer primaire sleutels zijn gedefinieerd op door de gebruiker gedefinieerd kolomtype Common Language Runtime (CLR), moet de type-implementatie binaire volgorde ondersteunen.
  •   Hoe toetsregistratie door HP audiostuurprogramma's op Elitebooks te blokkeren

    Buitenlandse sleutelbeperkingen – een overzicht

    Een externe sleutel (FK) omvat een kolom of een combinatie van meerdere die wordt gebruikt om een ​​koppeling tussen twee tabellen te maken en te binden en beheert de gegevens die moeten worden opgeslagen in een externe sleuteltabel.

    Een verwijzing naar een externe sleutel houdt in dat er een koppeling wordt gemaakt tussen twee tabellen; wanneer naar een kolom of kolommen met de primaire sleutel voor een andere tabel wordt verwezen door een kolom of kolommen in een andere tabel.

    In het referentiescenario voor externe sleutels wordt een verbinding tot stand gebracht tussen twee tabellen wanneer naar een kolom of kolommen met primaire sleutels in een tabel wordt verwezen door kolommen in een andere tabel.

    In een praktisch gebruiksvoorbeeld kunt u een tabel hebben, Sales.SalesOrderHeader, met een refererende sleutel die linkt naar een andere tabel, Sales.Person, omdat er een logische relatie bestaat tussen verkopers en verkooporders.

    Hier gaat de SalesPersonID in de kolom SalesOrderHeader samen met de primaire sleutelkolom van de SalesPerson-tabel. De externe sleutel van de tabel SalesPerson is de kolom SalesPersonID in de SalesOrderHeader.

    Deze relatie definieert een regel: een SalesPersonID-waarde kan niet in uw SalesOrderHeader-tabel voorkomen als deze niet bestaat in de SalesPerson-tabel.

    Een tabel kan naar maximaal 253 andere kolommen en tabellen verwijzen als externe sleutels, ook wel uitgaande verwijzingen genoemd. Sinds 2016 heeft de SQL-server het aantal tabellen en kolommen waarnaar u kunt verwijzen in een enkele tabel, ook wel inkomende referenties genoemd, verhoogd van 253 naar 10.000. De toename brengt echter enkele beperkingen met zich mee:

  • Verwijzingen naar externe sleutels van meer dan 253 zijn alleen beschikbaar voor de DELETE DML-bewerkingen. MERGE en UPDATE worden niet ondersteund.
  • Tabellen met refererende sleutelreferenties naar zichzelf zijn maximaal 253 refererende sleutelreferenties.
  • Voor kolomopslagindexen, voor geheugen geoptimaliseerde tabellen en gepartitioneerde externe-sleuteltabellen zijn verwijzingen naar externe sleutels beperkt tot 253.
  • Wat zijn de voordelen van buitenlandse sleutels?

    Zoals eerder vermeld, spelen externe sleutelbeperkingen een essentiële rol bij het waarborgen van de integriteit en gegevensconsistentie in de relationele database. Hier volgt een overzicht van redenen waarom externe sleutelbeperkingen essentieel zijn.

  • Referentiële integriteit – Foreign key-beperkingen garanderen dat elke onderliggende tabelrecord overeenkomt met een primaire tabelrecord, waardoor gegevensconsistentie in beide tabellen wordt gegarandeerd.
  • Verweesde records voorkomen – Als u een bovenliggende tabel verwijdert, zorgen externe sleutelbeperkingen ervoor dat uw gekoppelde onderliggende tabel ook wordt verwijderd, waardoor instanties van verweesde records worden voorkomen die kunnen leiden tot gegevensinconsistentie.
  • Verbeterde prestaties – Beperkingen op externe sleutels verhogen de queryprestaties doordat het databasebeheersysteem query’s kan optimaliseren op basis van tabelrelaties.
  •   AirPlay gebruiken met een Mac

    Indexen van buitenlandse sleutelbeperkingen

    Externe sleutelbeperkingen creëren niet automatisch overeenkomstige indexen zoals de primaire. U kunt handmatig indexen maken voor beperkingen op externe sleutels; het is gunstig om de volgende redenen.

    • Kolommen met externe sleutels worden vaak gebruikt in de join-criteria bij het combineren van gegevens uit gerelateerde tabellen in query’s door de kolommen te matchen die aan de beperking zijn gekoppeld. Indexen helpen de database bij het vinden van bijbehorende gegevens in een vreemde tabel.
    • Als u primaire sleutelbeperkingen wijzigt, worden deze gecontroleerd met de vreemde beperkingen in gerelateerde tabellen.

    Het is niet verplicht om indexen te maken. U kunt nog steeds gegevens uit twee tabellen combineren zonder de primaire en externe sleutelbeperkingen op te geven. Door externe sleutelbeperkingen toe te voegen, worden de tabellen echter geoptimaliseerd en gecombineerd in een query die voldoet aan de criteria voor het gebruik van de sleutels. Als u de primaire sleutelbeperkingen wijzigt, worden deze gecontroleerd met de vreemde in gerelateerde.

    Tips om Foreign Key Constraints in SQL te creëren

    Je hebt al veel tijd besteed aan de speculatie; antwoord op het waarom. Laten we onze focus verleggen en beperken tot de tactieken voor het creëren van externe sleutelbeperkingen; antwoord op het hoe.

    Een `Foreign Key`-veld in een tabel verwijst naar de `Primary Key` van een andere. De tabel met de primaire sleutel is uw bovenliggende tabel. En de tabel met de externe sleutel wordt de onderliggende tabel genoemd. Laten we erin duiken.

    Een externe sleutel maken tijdens het maken van een tabel

    Bij het maken van een tabel kunt u ook een externe sleutelbeperking creëren om de referentiële integriteit te behouden. Hier is hoe het te doen:

    CREATE TABLE orders (
        order_id INT PRIMARY KEY,
        customer_id INT,
        order_date DATE,
        FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
    );

    De bovenstaande code maakt een tabel met de naam ‘orders’ met de primaire integer-sleutel ‘order_id’, een ander integer ‘customer_id’ en de datum ‘order_date’. In dit geval wordt de FOREIGN KEY-beperking toegevoegd aan de kolom ‘customer_id’ en wordt verwezen naar de ‘customer_id’ in uw tabel ‘customers’.

    Een vreemde sleutel maken na het maken van een tabel

    Stel dat u al een tabel heeft gemaakt en een externe sleutelbeperking wilt toevoegen; gebruik de instructie `ALTER TABLE` in uw code. Kijk naar het codefragment hieronder.

    ALTER TABLE orders
    ADD FOREIGN KEY (customer_id) REFERENCES customers(customer_id);

    In dit geval heeft u een externe sleutelbeperking ‘customer_id’ kolom toegevoegd aan de tabel ‘orders’ om te verwijzen naar de kolom ‘customer_id’ in de tabel ‘customers’.

    Een externe sleutel maken zonder te controleren op bestaande gegevens

    Wanneer u een externe-sleutelbeperking aan een tabel toevoegt, controleert de database automatisch op bestaande gegevens om te zorgen voor consistentie met de beperking. Als u echter weet dat de gegevens consistent zijn en u een beperking wilt toevoegen zonder de consistentiecontrole, kunt u dit als volgt doen.

    ALTER TABLE orders
    ADD CONSTRAINT fk_orders_customers
    FOREIGN KEY (customer_id)
    REFERENCES customers(customer_id)
    NOT VALIDATE;

    De opdracht NOT VALIDATE vertelt de database om niet te controleren op bestaande gegevens. Dit specifieke geval is nuttig in specifieke gevallen. Bijvoorbeeld wanneer u enorme hoeveelheden gegevens heeft en het validatieproces wilt voltooien.

    Een Foreign Key aanmaken via DELETE/UPDATE

    Terwijl u externe-sleutelbeperkingen maakt, kunt u bepalen welke actie moet worden ondernomen in gevallen waarin de rij waarnaar wordt verwezen, wordt bijgewerkt of verwijderd. In dit geval gebruikt u trapsgewijze referentiële integriteitsbeperkingen om de te ondernemen acties te dicteren. Ze bevatten:

    #1. GEEN ACTIE

    Net als bij veel andere databases is de regel ‘GEEN ACTIE’ het standaardgedrag wanneer u een externe sleutelbeperking maakt. Dit betekent dat er geen actie wordt ondernomen wanneer de rij waarnaar wordt verwezen wordt verwijderd of bijgewerkt.

      Hoe u online een onderwerp kunt onderzoeken

    De database-engine genereert een fout als de externe sleutelbeperking wordt geschonden. Dit wordt echter niet aanbevolen, omdat dit kan leiden tot problemen met de referentiële integriteit, aangezien de beperking van de externe sleutel moet worden afgedwongen. Hier is een voorbeeld van hoe het te doen:

    ALTER TABLE orders
    ADD CONSTRAINT fk_orders_customers
    FOREIGN KEY (customer_id)
    REFERENCES customers(customer_id)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION;

    #2. CASCADE

    De ‘CASCADE’-regel is een andere optie voor de acties ‘ON DELETE’ en ‘ON UPDATE’ bij het maken van externe sleutelbeperkingen. Wanneer ingevoerd, betekent dit dat telkens wanneer een rij wordt bijgewerkt of verwijderd in de bovenliggende tabellen, de rijen waarnaar wordt verwezen dienovereenkomstig worden bijgewerkt of verwijderd. Deze techniek is krachtig bij het handhaven van referentiële integriteit. Hier is een voorbeeld:

    ALTER TABLE orders
    ADD CONSTRAINT fk_orders_customers
    FOREIGN KEY (customer_id)
    REFERENCES customers(customer_id)
    ON DELETE CASCADE
    ON UPDATE CASCADE;

    U moet scherp zijn bij het gebruik van deze regel, omdat deze ongewenste gevolgen kan hebben als deze niet zorgvuldig wordt gebruikt. U wilt voorkomen dat u per ongeluk te veel gegevens verwijdert of kringverwijzingen maakt. Gebruik deze optie daarom alleen indien nodig en met de nodige voorzichtigheid.

    Er zijn enkele regels voor het gebruik van CASCADE:

    • U kunt CASCADE niet opgeven als een tijdstempelkolom deel uitmaakt van de externe sleutel of waarnaar wordt verwezen.
    • Als uw tabel een INSTEAD OF DELETE-trigger heeft, kunt u ON DELETED CASCADE niet specificeren.
    • U kunt ON UPDATE CASCADE niet specificeren als uw tabel een INSTEAD OF UPDATE-trigger heeft.

    #3. NUL INSTELLEN

    Wanneer u een overeenkomstige rij in de bovenliggende tabel verwijdert of bijwerkt, worden alle waarden waaruit de refererende sleutel bestaat, op null gezet. Deze beperkingsregel vereist dat kolommen met externe sleutels nullbaar zijn om uit te voeren en kunnen niet worden gespecificeerd voor tabellen met IN PLAATS VAN UPDATE-triggers. Hier is een voorbeeld van hoe het te doen.

    ALTER TABLE orders
    ADD CONSTRAINT fk_orders_customers
    FOREIGN KEY (customer_id)
    REFERENCES customers(customer_id)
    ON DELETE SET NULL
    ON UPDATE SET NULL

    In dit geval heeft u de externe sleutelkolom ‘customer_id’ in de tabel ‘orders’ ingesteld op null als de overeenkomstige rij in de tabel ‘klanten’ wordt verwijderd of bijgewerkt.

    #4. STANDAARD INSTELLEN

    Hier stelt u alle waarden in die de externe sleutel standaard maken, op voorwaarde dat de rij waarnaar wordt verwezen in de bovenliggende tabel wordt bijgewerkt of verwijderd.

    Deze beperking wordt uitgevoerd als alle externe sleutelkolommen standaarddefinities hebben. Als een kolom nullbaar is, is de standaardwaarde ingesteld op NULL. Merk op dat deze optie niet kan worden opgegeven voor tabellen met triggers IN PLAATS VAN UPDATE. Hier is een voorbeeld:

    ALTER TABLE orders
    ADD CONSTRAINT fk_orders_customers
    FOREIGN KEY (customer_id)
    REFERENCES customers(customer_id)
    ON DELETE SET DEFAULT
    ON UPDATE SET DEFAULT;

    In het bovenstaande geval heeft u de ‘customer_id’ in de tabel “orders” ingesteld op de standaardwaarde, wat gebeurt wanneer de overeenkomstige rij in de tabel “klanten” wordt verwijderd of bijgewerkt.

    laatste woorden

    In deze handleiding heeft u een opfriscursus gehad over de beperkingen van de primaire sleutel en heeft u zich verdiept in de beperkingen van de externe sleutel. U bent ook verschillende technieken tegengekomen om externe sleutelbeperkingen te creëren. En hoewel er veel manieren zijn om externe sleutelbeperkingen te creëren, heeft dit bericht de methoden ontrafeld.

    En in de hoop dat je nieuwe technieken onder de knie hebt; je bent niet beperkt tot het combineren ervan. De beperkingsmethoden CASCADE, SET NULL, SET DEFAULT en NO ACTION kunnen bijvoorbeeld worden gecombineerd op tabellen met referentiële relaties.

    Als uw tabel GEEN ACTIE tegenkomt, keert deze terug naar andere beperkingsregels. In andere gevallen kan een DELETE-actie een combinatie van deze regels activeren en wordt de NO ACTION-regel als laatste uitgevoerd.

    Bekijk vervolgens het SQL-spiekbriefje.