Nybegynder? Så kan en SQL-fremmednøgle være fremmed for dig.
Du har måske hørt forskellige meninger om SQL-fremmednøgler. Hvis du ikke har, gør du det snart. Eller din oplevelse vil påvirke dit syn. Det vigtigste at vide er, fremmednøgler er et must i relationelle databaser.
Alligevel kan nogle udviklere fjerne eller ignorere fremmednøgler, når de står over for nogle komplikationer. Så hvad skal man gøre? Skal du bruge den fremmede nøgle eller ikke bruge den? Vil der være tidspunkter, hvor du ikke behøver at bruge dem?
Denne guide er for dig at se, hvor vigtig denne ting er. Du vil også kende nogle gotchas i kode og lære, hvordan du løser dem. Derudover vil vi selvfølgelig bruge praktiske eksempler. Der er ikke noget, du ikke kan klare.
Hvad er en udenlandsk SQL-nøgle?
Første ting først. Hvad er fremmednøgle i SQL? Med få ord er det en nøgle, der forbinder 2 tabeller. Lad os sige, at du har et forældrebord og et underordnet bord. Der er nogle fællestræk, der gør dem til en forælder og et barn – nøglen, der forbinder disse 2 tabeller.
I SQL-databaser er en fremmednøgle dog ikke kun relateret til tabeller. Det styrker forholdet. Det er derfor, det kaldes en fremmednøglebegrænsning.
Der opstår en fejl, hvis du forsøger at tilføje en underordnet post med en fremmednøgleværdi, der ikke findes i de primære nøgler i den overordnede tabel. Senere vil vi se kodeeksempler, der illustrerer dette.
Hvilke tabeller skal have SQL-foreign Key Constraints?
Børneborde kan have fremmednøgler. En fremmednøgle kan referere til en anden tabel. Der kan også være flere fremmednøgler i en "barn"-tabel. I SQL Server kan fremmednøgle referere til en primær nøgle eller en unik nøgle i en anden tabel.
Hvad med selvreference?
Dette går ud af den generelle definition af en fremmednøgle. En selvreference betyder, at du kan tildele en fremmednøgle, der referencer en anden kolonne i samme tabel . SQL Server, MySQL og Oracle understøtter dette.
Selvreference er relevant, når du ønsker at skabe hierarkier som leder-personale forholdet. Det er tilladt, men de fleste implementeringer af fremmednøgler er mellem 2 tabeller.
Senere får vi eksempler.
4 fordele ved at bruge udenlandske SQL-nøgler
Lad os udforske primærnøgle og fremmednøgle i SQL i detaljer. Hvad gør fremmednøgler til et must-have til en SQL-database? Lad os undersøge 4 punkter (her betyder begrænsningssyntaksen ikke noget).
1. Undgå "Manglende" data
"Manglende" data er fremmednøgleværdier fra underordnede tabeller uden tilknyttede primærnøgleværdier fra den overordnede tabel. De omtales også som forældreløse rækker. Når det sker, kan vi sige, at databasen har ringe eller ingen referenceintegritet.
Med fremmednøglebegrænsninger håndhævet, vil "manglende" data slet ikke ske. Databasemotoren tillader ikke sletning af en primær nøgleværdi, der refereres til af en anden tabel. Ligeledes vil indsættelse af en fremmednøgle i den underordnede tabel, som ikke findes i den overordnede tabels primære nøgler, udløse en fejl.
Hvad er det værste, der kan ske, hvis du ikke bruger begrænsningerne for fremmednøgle? Her er et par stykker:
- Kunderne modtager ikke produkter, de har betalt for.
- Behandlingen gives ikke til patienter.
- Manglende tjeklister springer sikkerhedsforanstaltninger over.
Du kan håndtere disse ting uden for databasen, men du skal kode det. Mere om dette følger.
Lad os sige, at en udvikler i din organisation håndterede den samme begrænsning uden for databasen. Vil han være ansvarlig og løse problemet i produktionen, hvis koden fejler? Det tror jeg ikke. Og hvad hvis du er databaseadministratoren? Så bliver du nødt til at rense deres rod. Ikke så opmuntrende, hvis du spørger mig.
2. Undgå inkonsistente rapporter
Det vedrører det første punkt. Hvis nogle data "mangler", vises inkonsistente totaler i forskellige rapporter. Detaljerne stemmer ikke overens med oversigterne. Forældreløse rækker summeres til summen af oversigterne. I mellemtiden fangede den detaljerede rapport ikke forældreløse rækker på grund af en indre sammenføjning til de overordnede tabeller.
Hvis det er din opgave at holde din database i god stand, vil du også rense dette rod.
3. Ingen kode nødvendig for at undgå forældreløse rækker
Udenlandske nøglebegrænsninger fungerer som selvrensende midler. I stedet for at du renser rod, gør databasen det ved ikke at tillade forældreløse rækker. Udenlandske nøglebegrænsninger fungerer også som politi. De arresterer den fejlbehæftede logik, der forårsager forældreløse rækker, og behandler det som en forbrydelse begået uden for databasen.
Vil du have en skinnende database fri for forældreløse rækker? Selvfølgelig gør du. Hvis du vil analysere dataene en dag, ville du være glad for, at du havde brugt fremmednøgler. Denne database vil være en god kilde til at kopiere de nødvendige data til dit iscenesættelsesområde.
4. Forstå hurtigt tabelrelationer i et diagram
SQL Server Management Studio har et indbygget diagramværktøj til din database. Primære og fremmede nøgler gør databasediagrammet informativt på et øjeblik. Det vil dog afhænge af, hvor mange tabeller med relationer du har inkluderet i diagrammet.
Diagrammer hjælper nye teammedlemmer med at forstå datastrukturen. For senior holdkammerater kan det også være nyttigt som dokumentation.
Når SQL-fremmednøgle kan være et "problem" (plus rettelsen)
For at migrere gamle data til en ny database, vil du indsætte poster i bulk. Hvis kildedatabasen har lav referenceintegritet, vil det være besværligt at indsætte poster fra kilden. Årsagen er, at fremmednøglefejl dukker op her og der.
Er der en rettelse? Du har 2 muligheder.
- Sørg for at udfylde referencetabellerne eller de overordnede tabeller først. Derefter skal du udfylde de underordnede tabeller. En komplikation kører meget langsomt. I andre tilfælde opstår der flere begrænsningsfejl med fremmednøgle. Hvis sidstnævnte tilfælde finder sted, skal du revurdere rækkefølgen af indsættelser og sikre, at de primære nøgler indsættes først. Hvis der er et "langsomt" problem, så overvej den næste mulighed.
- Deaktiver de fremmede nøgler midlertidigt og aktiver dem, efter at migreringen er udført (og renset). Du kan gøre det i SQL Server Management Studio eller bruge T-SQL ALTER TABLE. Det er dog lettere sagt end gjort. På dette tidspunkt har du brug for mere tålmodighed ud over din forstand og viljestyrke. Senere finder vi syntaksen for deaktivering og genaktivering af fremmednøgler.
En anden ting at overveje er at bruge en database som et iscenesættelsesområde for OLAP eller dataanalyse. Antag, at kildetransaktionsdatabasen er ren fra forældreløse rækker. Eller du kan klare at undgå disse rækker gennem kode. Så kan du vælge ikke at bruge fremmednøgler. Fremmednøgler vil bremse masseindsættelser og opdateringer, især på enorme datasæt.
3 nemme måder at tilføje, redigere og slette SQL-foreign Key Constraints
Hvad skal der til for at tilføje, redigere eller slette fremmednøgler? Det er nemt med disse 3 tips.
De første to trin bruger en grafisk brugergrænseflade. Værktøjer som SQL Server Management Studio eller dbForge Studio til SQL Server er meget gode kandidater. Den tredje vil bruge T-SQL-kode. Valget af en GUI eller T-SQL-kode afhænger af situationen.
1. Brug af tabeldesigner til at tilføje, redigere og slette SQL-foreign Key Constraint
Det er muligt i SQL at tilføje fremmednøglebegrænsninger, når du opretter eller ændrer en tabelstruktur ved hjælp af Table Designer i SSMS. Figur 1 nedenfor viser, hvordan du får adgang til det fra hovedmenuen, når tabelstrukturen er åben.
En anden mulighed er at højreklikke hvor som helst fra tabeldesigneren og vælge Relationer fra kontekstmenuen:
Når du har valgt Relationer , Foreign Key Relationships vindue vil dukke op:
I Foreign Key Relationships vindue, kan du vælge at tilføje en ny fremmednøgle eller redigere/slette en eksisterende.
Hvis du vælger at tilføje eller redigere, skal du klikke for at udvide tabeller og kolonner Specifikationer. Klik derefter på ellipsen knappen for at definere eller redigere primær- og fremmednøgletabellerne.
Derfra kan du angive primær- og fremmednøglekolonnerne.
Klik på OK efter at have defineret de primære og fremmede nøgler . Naviger derefter tilbage til tabeldesigneren og gem ændringerne.
2. Brug af databasediagram til at tilføje, redigere og slette SQL-foreign Key Constraint
Du kan bruge databasediagrammet til at oprette SQL-fremmednøglebegrænsninger. Figur 5 viser, hvordan man opretter en relation mellem to tabeller ved at klikke på fremmednøgletabellen og trække den til primærnøgletabellen.
Når du slipper musen, vises tabeller og kolonner vindue vil dukke op som det i figur 4. Så kan du angive primær- og fremmednøglekolonnerne. Klik derefter på OK.
For at redigere en eksisterende relation skal du højreklikke på en relation i diagrammet. Vælg derefter Egenskaber :
Derefter i Egenskaber vindue, udvid Tabeller og kolonner og klik på ellipsen knap:
Efter at have klikket på ellipsen knappen, Tabeller og kolonner vinduet vises. Du kan ændre primær- og fremmednøglekolonnerne (se figur 4 ovenfor igen).
I mellemtiden sletter et forhold kræver, at du højreklikker på en eksisterende forhold. Vælg Slet relationer fra databasen og klik på Ja når du bliver bedt om det.
3. Brug af T-SQL til at tilføje, redigere og slette SQL-foreign Key Constraint
Den tredje måde at tilføje en fremmednøgle på er gennem T-SQL-koden. Du kan bruge SQL CREATE TABLE og tilføje den fremmede nøgle-begrænsning. Eller du kan også bruge ALTER TABLE til at tilføje denne begrænsning efter oprettelse af tabellen.
Her er syntaksen for at bruge CREATE TABLE:
-- Enkeltkolonne fremmed nøgleCREATE TABLE Tabel2(ID INT IDENTITY(1,1) IKKE NULL PRIMÆR NØGLE KLYNGET, kol1 INT NULL REFERENCER Tabel1(col1))GO
Efter at have defineret kolonnenavnet og -typen, kan du tilføje REFERENCER til en tabel og kolonne. Ovenstående syntaks viser Tabel1 tabel på col1 kolonne. Bemærk, at kolonnenavne på begge tabeller skal være de samme for at være gyldige for fremmednøgler.
Ovenstående syntaks er for fremmednøgler med en enkelt kolonne. Hvis du har brug for flere kolonner som fremmednøgler, skal du bruge FOREIGN KEY-sætningen som nedenfor:
-- Fremmednøgle med flere kolonner OPRET TABEL Tabel2(ID INT IDENTITET(1,1) IKKE NULL PRIMÆR NØGLE KLYNGET, kol1 INT IKKE NULL, kol2 INT IKKE NULL, col3 VARCHAR(10) NULL BEGRÆNSNING FK_Tabel1_Tabel2 FOREIGN (col1, col2) REFERENCER Tabel1(col1,col2))GO
Efter at have oprettet tabellen, kan du tilføje fremmednøgler ved hjælp af ALTER TABLE. Her er syntaksen:
ÆNDRINGSTABEL Tabel2 MED KONTROL TILFØJ BEGRÆNSNING FK_Tabel1_Tabel2_2 UDENLANDSKE NØGLE(col3) REFERENCER Tabel3(col1)GO
For at slette en fremmednøglebegrænsning kan du bruge ALTER TABLE med DROP CONSTRAINT:
ÆNDRINGSTABEL Tabel 2 SLIPBEGRÆNSNING FK_Tabel1_Tabel2_2GO
Nu kan vi opsummere 3 måder at tilføje, redigere og slette fremmednøgler på:
Eksempler på SQL (MySQL) udenlandske nøglebegrænsninger
Børnetabel med 1 reference til en overordnet tabel
-- Enkelt referenceCREATE TABEL [dbo].[Lande]( [CountryID] [int] IDENTITY(1,1) NOT NULL, [Country] [nvarchar](50) NOT NULL, [ContinentID] [ int] NULL, [Modified] [datetime] NOT NULL, CONSTRAINT [PK_Country] PRIMÆR NØGLE KLUSTERET ( [CountryID] ASC))GOALTER TABEL [dbo].[Lande] MED KONTROL TILFØJ BEGRÆNSNING [FK_Countries_Continent] UDENLANDSKE NØGLE()[Kontinent] REFERENCER [dbo].[Continent] ([ContinentID])GOALTER TABEL [dbo].[Lande] CHECK CONSTRAINT [FK_Countries_Continent]GO
For at visualisere dette forhold, se figur 9 nedenfor:
ContinentID er nøglen, der forbinder de to tabeller.
Børnetabel med flere referencer
Sportsbilen tabel har flere referencer til tre forskellige tabeller:
-- Flere referencerCREATE TABLE [dbo].[SportsCars]( [SportsCarID] [int] IDENTITY(1,1) NOT NULL, [ManufacturerID] [int] NULL, [StyleID] [int] NULL, [CountryID] [int] NULL, [Model] [nvarchar](50) NOT NULL, [År] [varchar](50) NOT NULL, [Noter] [varchar](255) NOT NULL, [Ændret] [datetime] IKKE NULL, BEGRÆNSNING [PK_SportsCars] PRIMÆR NØGLE KLUSTERET ( [SportsCarID] ASC))GOALTER TABEL [dbo].[SportsCars] MED KONTROL TILFØJ BEGRÆNSNING [FK_SportsCars_Country] UDENLANDSKE NØGLE([Lande-ID])Referencer ([Lande-ID])d. CountryID])GOALTER TABEL [dbo].[SportsCars] CHECK BEGRÆNSNING [FK_SportsCars_Country]GOALTER TABEL [dbo].[SportsCars] MED CHECK TILFØJ BEGRÆNSNING [FK_SportsCars_Manufacturer] UDENLANDSKE NØGLE([Producent-ID] ([fabrikant-ID]) ManufacturerID])GOALTER TABLE [dbo].[SportsCars] CHECK BEGRÆNSNING [FK_SportsCars_Manufacturer]GOALTER TABEL [dbo].[SportsCars] MED CHECK TILFØJ BEGRÆNSNING [FK_SportsCars_Styles] UDENLANDSKE NØGLER]()[Style]d. StyleID])GOALTE R TABEL [dbo].[SportsCars] KONTROLLER BEGRÆNSNING [FK_SportsCars_Styles]GO
Sådan ser det ud i et databasediagram:
Selvreference
Positionshierarkier viser selvreference i følgende tabel:
OPRET TABEL [dbo].[Rank]( [RankId] [int] IDENTITY(1,1) NOT NULL, [Rank] [varchar](50) NOT NULL, [RankLevel] [smallint] NOT NULL, [RankParentId] [int] NULL, BEGRÆNSNING [PK_Ranks] PRIMÆR NØGLE KLUSTERET ( [RankId] ASC)) PÅ [PRIMARY]GOALTER TABEL [dbo].[Ranks] MED CHECK TILFØJ BEGRÆNSNING [FK_Ranks_Ranks(] UDENLANDSKE KÆRKE )REFERENCER [dbo].[Ranks] ([RankId])GOALTER TABEL [dbo].[Ranks] CHECK CONSTRAINT [FK_Ranks_Ranks]GO
Diagrammet af denne selvreference er enkelt. Linjen peger på den samme tabel i selvhenvisning.
Med ON UPDATE og ON DELETE
Med ON UPDATE CASCADE vil opdatering af en primær nøglekolonneværdi også opdatere fremmednøgleværdierne i relaterede tabeller. I mellemtiden, når du bruger PÅ SLET CASCADE, vil sletning af en primær nøgle også slette fremmednøgler. Standarden for ON UPDATE og ON DELETE er INGEN HANDLING.
Her er et eksempel på OPDATERING og SLET CASCADE:
ÆNDRINGSTABEL [dbo].[Lande] MED KONTROL TILFØJ BEGRÆNSNING [FK_Countries_Continent] UDENLANDSKE NØGLE([ContinentID])REFERENCER [dbo].[Kontinent] ([ContinentID]) PÅ OPDATERING CASCADE PÅ SLETT CASCADEGO kode>
Deaktivering af en SQL-foreign Key Constraint
Følgende vil deaktivere en eksisterende fremmednøglebegrænsning. Bemærk, at forholdet stadig eksisterer.
ÆNDRINGSTABEL [dbo].[SportsCars] NOCHECK CONSTRAINT [FK_SportsCars_Country]GO
Dette er ikke standard, og det anbefales ikke. Men for at fremskynde masseindsættelser og opdateringer kan du midlertidigt deaktivere fremmednøglen som den ovenfor. Når du er færdig, skal du skifte den tilbage ved at bruge CHECK CONSTRAINT.
ÆNDRINGSTABEL [dbo].[SportsCars] CHECK CONSTRAINT [FK_SportsCars_Country]GO
Gotchas og rettelser
Dette afsnit vil vise dig, hvad der sker, når du INDSÆTTER, OPDATER eller SLETTER poster med fremmednøgler. Dette forudsætter også, at fremmednøgler ikke er deaktiveret med NOCHECK CONSTRAINT. Dette vil hjælpe dig, når du støder på disse almindelige problemer.
På INSERT
-- Dette vil forårsage en fejl, fordi countryID =47 ikke findes i landetabellenINDSÆT I SportsCars (ManufacturerID, StyleID, CountryID, Model, Years, Notes) VALUES (108, 10, 47, 'F2' , '2021', 'Limited Edition')GO
Her er fejlmeddelelsen:
Besked 547, niveau 16, tilstand 0, linje 56. INSERT-sætningen var i konflikt med FOREIGN KEY-begrænsningen "FK_SportsCars_Country". Konflikten opstod i databasen "Køretøjer", tabel "dbo.Lande", kolonne 'CountryID'. Udsagnet er blevet afsluttet.
Løsningen :Tilføj CountryID =47 til Lande bord først. Kør derefter INSERT-sætningen ovenfor igen. Sekvensen starter med at indsætte poster i den overordnede tabel og derefter i den underordnede tabel.
På OPDATERING
-- Opdater CountryID til 47 vil udløse en fejl.OPDATERING SportsCarsSET CountryID =47WHERE ManufacturerID =108GO
Her er OPDATERING-fejlen:
Besked 547, niveau 16, tilstand 0, linje 60. UPDATE-sætningen var i konflikt med FOREIGN KEY-begrænsningen "FK_SportsCars_Country". Konflikten opstod i databasen "Køretøjer", tabel "dbo.Lande", kolonne 'CountryID'. Udsagnet er blevet afsluttet.
Løsningen :Tilføj CountryID =47 til Lande bord. Kør derefter UPDATE-sætningen igen.
På SLET
-- Dette vil udløse en fejl, fordi der henvises til ManufacturerID =108 i SportsCars-tabellen SLET FRA ManufacturersWHERE ManufacturerID =108
Denne kode vil udløse fejlen som nedenfor:
Besked 547, niveau 16, tilstand 0, linje 64DELETE-sætningen var i konflikt med REFERENCE-begrænsningen "FK_SportsCars_Manufacturer". Konflikten opstod i databasen "Køretøjer", tabel "dbo.SportsCars", kolonne 'ManufacturerID'. Udsagnet er blevet afsluttet.
Løsningen :Slet de tilsvarende poster fra SportsCars tabel med Producent-ID =108. Kør derefter DELETE-sætningen ovenfor igen. En anden måde er at aktivere ON SLET CASCADE, hvis det er relevant. Sekvensen starter med at slette poster fra de underordnede tabeller og derefter – fra den overordnede tabel.
Takeaways
Så er fremmednøgler stadig fremmede for dig?
Lad os få en opsummering af, hvad vi har lært indtil videre.
- Fremmednøgler forbinder to tabeller (eller én tabel ved brug af selvreference). Du har brug for dem for at sikre referentiel integritet.
- Du kan bruge enten et GUI-værktøj eller T-SQL til at tilføje, redigere eller slette fremmednøglebegrænsningerne.
- For GUI-værktøjer kan du bruge SQL Server Management Studio eller dbForge Studio til SQL Server. Begge tilbyder databasediagrammer og tabeldesignere til at oprette tabeller med primære og fremmede nøgler.
- CREATE TABLE og ALTER TABLE er velegnede til at tilføje og slette fremmednøglebegrænsningerne.
- Du kan midlertidigt deaktivere fremmednøgler med NOCHECK CONSTRAINT i ALTER TABLE. Dette vil fremskynde masseindsættelser og opdateringer. Men sørg for at aktivere det igen med CHECK CONSTRAINT.
- For at undgå gotchas med fremmednøgler skal du sørge for at følge den rigtige rækkefølge. For INSERT og UPDATE skal du først indsætte i den overordnede tabel og derefter i de underordnede tabeller. For SLET skal du først slette de underordnede poster og derefter slette overordnede poster.
Vil du tilføje noget for at hjælpe nybegyndere med at mestre fremmednøgler? Kommentarerne sektionen er åben for dine lyse ideer. Hvis du kan lide dette opslag, så del det på dine foretrukne sociale medieplatforme.