sql >> Databasteknik >  >> RDS >> Database

SQL FOREIGN KEY Begränsning:The Ultimate, Easy Guide för nybörjare

Nybörjare? Då en SQL främmande nyckel kan vara främmande för dig.

Du kanske har hört olika åsikter om SQL främmande nycklar. Om du inte har, snart kommer du att. Eller din erfarenhet kommer att påverka vyn. Det viktigaste att veta är, främmande nycklar är ett måste i relationsdatabaser.

Ändå kan vissa utvecklare ta bort eller ignorera främmande nycklar när man står inför några komplikationer. Så vad ska man göra? Om du vill använda den främmande nyckeln eller inte använda den? Kommer det att finnas tillfällen då du inte kommer att behöva använda dem?

Denna guide är för dig att se hur viktigt det här är. Du kommer också att känna till några gotchas i kod och lära hur man rättar till dem. Dessutom, naturligtvis, använder vi praktiska exempel. Det finns inget du inte kan hantera.

Vad är en SQL Foreign Key?

Första saker först. Vad är främmande nyckel i SQL? I några få ord, det är en nyckel som länkar 2 tabeller. Låt oss säga att du har en överordnad tabell och ett barn bord. Det finns en viss gemensamhet gör dem en förälder och ett barn -. Nyckeln som gäller dessa 2 bord

Men i SQL-databaser, en främmande nyckel inte endast avse tabeller. Det verk relationen. Det är därför det kallas en främmande avgörande begränsning.

Ett fel uppstår om du försöker lägga till ett barn rekord med en främmande nyckel-värde som inte finns i de primära nycklarna till överordnade tabellen. Senare kommer vi att se kodexempel illustrerar detta.

vilka tabeller bör ha SQL främmande nycklar?

Barn tabeller kan ha främmande nycklar. En främmande nyckel kan referera en annan tabell. Dessutom kan det finnas flera främmande nycklar i ett ”barn” bord. I SQL Server, kan främmande nyckel referera en primärnyckel eller en unik nyckel i en annan tabell.

Hur Om självreferens?

Detta går ut ur den allmänna definitionen av en främmande nyckel. En självreferens innebär att du kan tilldela en främmande nyckel som referenser en annan kolumn i samma tabell . SQL Server, MySQL och Oracle stödja detta.

Självreferens gäller när du vill skapa hierarkier som chef-personal relation. Det är tillåtet, fortfarande, de flesta implementationer av främmande nycklar är mellan 2 tabeller.

Senare kommer vi att ha exempel.

4 Fördelar med att använda SQL främmande nycklar

Låt oss undersöka primärnyckeln och främmande nyckel i SQL i detalj. Vad gör främmande nycklar ett måste till en SQL-databas? Låt oss undersöka 4 poäng (här begränsningen syntax kommer ingen roll).

1. Undvik ”Missing” Data

”Missing” data är utländska nyckelvärden från barn bord utan tillhörande primära nyckelvärden från den överordnade tabellen. De är också kallas föräldralösa rader. När det händer, kan vi säga att databasen har liten eller ingen referensintegritet.

Med främmande nycklar verk, ”saknas” uppgifter kommer inte att ske alls. Databasmotorn kommer inte att tillåta radering av en primärnyckel värde som refereras av en annan tabell. Likaså att sätta in en främmande nyckel i barnets tabell som är obefintlig i den överordnade tabellens primärnycklar kommer att utlösa ett fel.

Vad är det värsta som kan hända om du inte använder nycklar utländska? Här är några:

  • Kunderna kommer inte att få produkter som de betalat för.
  • Behandling inte administreras till patienter.
  • Saknade checklistor lift säkerhetsåtgärder.

Du klarar det här utanför databasen, men du måste koden det. Mer om detta kommer att följa.

Låt oss säga att en utvecklare i din organisation hanteras på samma begränsning utanför databasen. Kommer han att vara ansvarig och åtgärda problemet i produktionen om koden misslyckas? Jag tror inte det. Och vad händer om du är databasen admin? Då måste du rengöra sina röran. Inte så uppmuntrande om du frågar mig.

2. Undvik Blandat Rapporter

Den hänför sig till den första punkten. Om vissa uppgifter ”saknas” inkonsekventa summorna visas i olika rapporter. Detaljer matchar inte sammanfattningarna. Föräldralösa rader lägga till upp till summan av sammanfattningarna. Samtidigt detaljerad rapport inte fånga föräldralösa rader på grund av en inre gå till moderbord.

Om det är ditt jobb att hålla din databas i gott skick, kommer du också städa här röran.

3. Ingen kod behövs för att undvika Föräldralösa Rader

Främmande nycklar fungerar som självrengörande medel. Istället för att du rengöra röran, gör databasen det genom att inte tillåta föräldralösa rader. Främmande nycklar fungerar också som polisen. De arresterar den felaktiga logik som bringar föräldralösa rader, behandla det som ett brott sker utanför databasen.

Vill du ha en glänsande databas fri från föräldralösa rader? Självklart gör du det. Om du vill analysera data dag, skulle du vara glad att du hade använt främmande nycklar. Denna databas kommer att vara en bra källa för att kopiera de nödvändiga data till mellanlagringsområdet.

4. Snabbt förstå Tabell Relationer i ett diagram

SQL Server Management Studio har ett inbyggt diagramverktyg för databasen. Primära och främmande nycklar göra databasen diagrammet informativ med ett ögonkast. Det kommer dock att bero på hur många bord med relationer du har inkluderat i diagrammet.

Diagram hjälpa nya medarbetare att förstå datastrukturen. För ledande lagkamrater, kan det vara bra också som dokumentation.

När SQL Foreign Key Kan vara ett ”problem” (plus Fix)

Att migrera gamla data till en ny databas, kommer du infoga poster i bulk. Om källdatabasen har låg referensintegritet, kommer det att vara jobbigt att sätta rekord från källan. Anledningen är att viktiga fel utländska dyka upp här och där.

Finns det en fix? Du har 2 alternativ.

  1. Se till att fylla referenstabeller eller moderbord först. Efter det fylla de barn bord. En komplikation är att köra mycket långsamt. I andra fall, mer utländska avgörande begränsning fel uppstår. Om det senare fallet sker, måste du omvärdera sekvensen av insatser och se till att primärnycklar sätts först. Om det finns en ”slow-running” problem, anser nästa alternativ.
  2. Inaktivera de främmande nycklar tillfälligt och att de efter övergången är klar (och rengöras). Du kan göra det i SQL Server Management Studio eller använda T-SQL ALTER TABLE. Men det är lättare sagt än gjort. Vid denna punkt, behöver du mer tålamod utöver din intelligens och viljestyrka. Senare hittar vi syntaxen för att inaktivera och återaktivera främmande nycklar.

En annan sak att tänka på är att använda en databas som en mellanstation område för OLAP eller dataanalys. Antag källan transaktionsdatabasen är ren från föräldralösa rader. Eller så kan du lyckas undvika dessa rader genom kod. Sedan kan du välja att inte använda främmande nycklar. Främmande nycklar kommer att sakta ner massinlägg och uppdateringar, särskilt på humongous datamängder.

3 enkla sätt att lägga till, redigera och ta bort SQL främmande nycklar

Vad krävs det för att lägga till, redigera eller ta bort främmande nycklar? Det är enkelt med dessa 3 tips.

De två första stegen använder ett grafiskt användargränssnitt. Verktyg som SQL Server Management Studio eller dbForge Studio för SQL Server är mycket bra kandidater. Den tredje kommer att använda T-SQL-kod. Valet av ett GUI eller T-SQL-kod beror på situationen.

1. Använda Tabell Designer lägga till, redigera och ta bort SQL Foreign Key Constraint

Det är möjligt i SQL för att lägga till nycklar utländska när skapa eller ändra en tabell struktur med hjälp av Tabell Designer i SSMS. Figur 1 nedan visar hur man kommer åt den från huvudmenyn när tabellstrukturen är öppen.

Ett annat alternativ är att högerklicka var som helst från bordet designer och välj Förhållanden från snabbmenyn:

När du har valt Förhållanden , främmande nyckel relationer fönster kommer att dyka upp:

I främmande nyckel relationer fönstret kan du välja att lägga till en ny främmande nyckel eller redigera / ta bort en befintlig.

Om du väljer att lägga till eller redigera, klicka för att expandera Tabeller och kolumner Specifikationer. Klicka sedan på ellips knappen för att definiera eller redigera de primära och främmande nycklar tabeller.

Därifrån kan du ange den primära och främmande nycklar kolumner.

Efter att ha definierat de primära och främmande nycklar klickar du på OK . Navigera sedan tillbaka till bordet designer och spara ändringarna.

2. Använda Database Diagram lägga till, redigera och ta bort SQL Foreign Key Constraint

Du kan använda databas Diagram för att skapa SQL främmande nycklar. Figur 5 visar hur man skapar en relation mellan två tabeller genom att klicka den främmande nyckeltabellen och dra den till den primära nyckeltabellen.

När du släpper musen, Tabeller och kolumner fönster kommer att dyka upp som den i figur 4. Sedan kan du ange den primära och främmande nycklar kolumner. Klicka sedan på OK.

För att redigera en befintlig relation, högerklicka på en relation i diagrammet. Välj sedan Egenskaper :

Då, i Egenskaper fönster, expandera tabeller och kolumner och klicka på ellips knapp:

När du klickat på ellips knappen, Tabeller och kolumner fönster visas. Ändra de primära och utländska nyckelkolumner (se figur 4 ovan igen).

Under tiden, ta bort ett förhållande kräver att högerklicka en befintliga relation. Välj Radera relationer från databasen och klicka på Ja vid uppmaning.

3. Använda T-SQL lägga till, redigera och ta bort SQL Foreign Key Constraint

Det tredje sättet att lägga till en främmande nyckel är genom T-SQL-kod. Du kan använda SQL CREATE TABLE och lägga till främmande avgörande begränsning. Eller så kan du också använda ALTER TABLE för att lägga till denna begränsning efter att skapa tabellen.

Här är syntaxen för att använda CREATE TABLE:

-- Single-column foreign key
CREATE TABLE Table2
(ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED,
 col1 INT NULL REFERENCES Table1(col1)
)
GO

Efter att definiera kolumnnamnet och typ, kan du lägga till angående ett bord och kolumn. De ovan syntax visar Table1 tabellen på col1 kolumn. Observera att kolumnnamn på båda tabellerna måste vara samma att gälla för utländska nycklar.

Ovanstående syntax är avsedd för engångs kolumner främmande nycklar. Om du behöver flera kolumner som främmande nycklar, använd FOREIGN klausul KEY enligt nedan:

-- Multiple-column foreign key
CREATE TABLE Table2
(ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED,
 col1 INT NOT NULL,
 col2 INT NOT NULL,
 col3 VARCHAR(10) NULL
 CONSTRAINT FK_Table1_Table2 FOREIGN KEY(col1, col2)
	REFERENCES Table1(col1,col2)
)
GO

När du har skapat tabellen, kan du lägga till främmande nycklar med hjälp av ALTER TABLE. Här är syntaxen:

ALTER TABLE Table2 WITH CHECK ADD CONSTRAINT FK_Table1_Table2_2 FOREIGN KEY(col3)
	REFERENCES Table3(col1)
GO

För att ta bort en främmande avgörande begränsning, kan du använda ALTER bord med DROP Begränsning:

ALTER TABLE Table2 
DROP CONSTRAINT FK_Table1_Table2_2
GO

Nu kan vi summera 3 sätt att lägga till, redigera och radera främmande nycklar:

SQL (MySQL) Foreign avgörande begränsning Exempel

Child tabell med en Referens till en överordnad tabell

-- Single Reference
CREATE TABLE [dbo].[Countries](
	[CountryID] [int] IDENTITY(1,1) NOT NULL,
	[Country] [nvarchar](50) NOT NULL,
	[ContinentID] [int] NULL,
	[Modified] [datetime] NOT NULL,
 CONSTRAINT [PK_Country] PRIMARY KEY CLUSTERED 
(
	[CountryID] ASC
))
GO

ALTER TABLE [dbo].[Countries]  WITH CHECK ADD CONSTRAINT [FK_Countries_Continent] FOREIGN KEY([ContinentID])
REFERENCES [dbo].[Continent] ([ContinentID])

GO

ALTER TABLE [dbo].[Countries] CHECK CONSTRAINT [FK_Countries_Continent]
GO

Att visualisera denna relation, titta på figur 9 nedan:

ContinentID är nyckeln som relaterar de två tabeller tillsammans.

Child Tabell Med Flera referenser

SportsCar tabellen har flera referenser till tre olika tabeller:

Multipel ReferencesCREATE TABELL [dbo] [Sports] ([SportsCarID] [int] IDENTITY (1,1) NOT NULL, [ManufacturerID] [int] NULL, [StyleID] [int] NULL, -
-- Multiple References
CREATE TABLE [dbo].[SportsCars](
	[SportsCarID] [int] IDENTITY(1,1) NOT NULL,
	[ManufacturerID] [int] NULL,
	[StyleID] [int] NULL,
	[CountryID] [int] NULL,
	[Model] [nvarchar](50) NOT NULL,
	[Years] [varchar](50) NOT NULL,
	[Notes] [varchar](255) NOT NULL,
	[Modified] [datetime] NOT NULL,
 CONSTRAINT [PK_SportsCars] PRIMARY KEY CLUSTERED 
(
	[SportsCarID] ASC
))
GO

ALTER TABLE [dbo].[SportsCars] WITH CHECK ADD CONSTRAINT [FK_SportsCars_Country] FOREIGN KEY([CountryID])
REFERENCES [dbo].[Countries] ([CountryID])
GO

ALTER TABLE [dbo].[SportsCars] CHECK CONSTRAINT [FK_SportsCars_Country]
GO

ALTER TABLE [dbo].[SportsCars] WITH CHECK ADD CONSTRAINT [FK_SportsCars_Manufacturer] FOREIGN KEY([ManufacturerID])
REFERENCES [dbo].[Manufacturers] ([ManufacturerID])
GO

ALTER TABLE [dbo].[SportsCars] CHECK CONSTRAINT [FK_SportsCars_Manufacturer]
GO

ALTER TABLE [dbo].[SportsCars] WITH CHECK ADD CONSTRAINT [FK_SportsCars_Styles] FOREIGN KEY([StyleID])
REFERENCES [dbo].[Styles] ([StyleID])
GO

ALTER TABLE [dbo].[SportsCars] CHECK CONSTRAINT [FK_SportsCars_Styles]
GO

Här är hur det visas i en databas diagram:

Själv Referens

Positions hierarkier visar självreferens i följande tabell:

CREATE TABLE [dbo].[Ranks](
	[RankId] [int] IDENTITY(1,1) NOT NULL,
	[Rank] [varchar](50) NOT NULL,
	[RankLevel] [smallint] NOT NULL,
	[RankParentId] [int] NULL,
 CONSTRAINT [PK_Ranks] PRIMARY KEY CLUSTERED 
(
	[RankId] ASC
)) ON [PRIMARY]
GO

ALTER TABLE [dbo].[Ranks] WITH CHECK ADD CONSTRAINT [FK_Ranks_Ranks] FOREIGN KEY([RankParentId])
REFERENCES [dbo].[Ranks] ([RankId])
GO

ALTER TABLE [dbo].[Ranks] CHECK CONSTRAINT [FK_Ranks_Ranks]
GO

Diagrammet av denna självreferens är enkel. The line pekar mot samma tabell i självreferens.

Med ON UPDATE och ON DELETE

Med ON UPDATE CASCADE kommer att uppdatera en primärnyckel kolumnvärde uppdatera utländska nyckelvärdena i relaterade tabeller samt. Samtidigt när du använder på DELETE CASCADE, ta bort en primärnyckel kommer också att ta bort främmande nycklar. Standard för ON UPDATE och ON DELETE är ingen åtgärd.

Här är ett exempel på uppdatera och ta bort CASCADE:

ALTER TABLE [dbo].[Countries] WITH CHECK ADD CONSTRAINT [FK_Countries_Continent] FOREIGN KEY([ContinentID])
REFERENCES [dbo].[Continent] ([ContinentID]) 
ON UPDATE CASCADE 
ON DELETE CASCADE
GO

Inaktivera en SQL Foreign Key Constraint

Följande kommer att stänga en befintlig främmande avgörande begränsning. Observera att fortfarande existerar relationen.

ALTER TABLE [dbo].[SportsCars] NOCHECK CONSTRAINT [FK_SportsCars_Country]
GO

Detta är inte standard, och det är inte att rekommendera. Men för att påskynda massinlägg och uppdateringar, kan du tillfälligt inaktivera främmande nyckel som den ovan. När du är klar, måste du slå tillbaka med hjälp av kontrollregel.

ALTER TABLE [dbo].[SportsCars] CHECK CONSTRAINT [FK_SportsCars_Country]
GO

gotchas och Fixes

I det här avsnittet kommer att visa dig vad som händer när du sätter, uppdatera eller ta bort poster med främmande nycklar. Detta förutsätter också att främmande nycklar är inte handikappade med nocheck CONSTRAINT. Detta kommer att hjälpa dig när du stöter på dessa gemensamma problem.

På INSERT

-- This will cause an error because countryID = 47 does not exist in the Countries table
INSERT INTO SportsCars 
(ManufacturerID, StyleID, CountryID, Model, Years, Notes) 
VALUES (108, 10, 47, 'F2', '2021', 'Limited Edition')
GO

Här är felmeddelandet:

Msg 547, Level 16, State 0, Line 56
The INSERT statement conflicted with the FOREIGN KEY constraint "FK_SportsCars_Country". The conflict occurred in database "Vehicles", table "dbo.Countries", column 'CountryID'.
The statement has been terminated.

The Fix :Lägg CountryID =47 in i Länder bordet först. Sedan åter köra INSERT uttalande ovan. Sekvensen startar med införing poster i den överordnade tabellen, och sedan in i barnet bordet.

På UPDATE

-- Update CountryID to 47 will trigger an error.
UPDATE SportsCars
SET CountryID = 47
WHERE ManufacturerID = 108
GO

Här är UPDATE fel:

Msg 547, Level 16, State 0, Line 60
The UPDATE statement conflicted with the FOREIGN KEY constraint "FK_SportsCars_Country". The conflict occurred in database "Vehicles", table "dbo.Countries", column 'CountryID'.
The statement has been terminated.

The Fix :Lägg CountryID =47 in i Länder tabell. Sedan åter köra UPDATE uttalande.

På DELETE

-- This will trigger an error because ManufacturerID = 108 is referenced in the SportsCars table
DELETE FROM Manufacturers
WHERE ManufacturerID = 108

Denna kod kommer att utlösa fel som nedan:

Msg 547, Level 16, State 0, Line 64
The DELETE statement conflicted with the REFERENCE constraint "FK_SportsCars_Manufacturer". The conflict occurred in database "Vehicles", table "dbo.SportsCars", column 'ManufacturerID'.
The statement has been terminated.

The Fix :Radera de motsvarande poster från Sports bord med ManufacturerID =108. Därefter åter köra DELETE uttalande ovan. Ett annat sätt är att göra det möjligt ON DELETE CASCADE om tillämpligt. Sekvensen startar med radera poster från barn bord, och sedan -. Från den överordnade tabellen

Hämtmat

Så, är främmande nycklar fortfarande främmande för dig?

Låt oss ta en resumé av vad vi lärt oss hittills.

  • Främmande nycklar länka två tabeller (eller en tabell vid användning av självreferens). Du behöver dem för att säkerställa referensintegritet.
  • Du kan använda antingen ett grafiskt verktyg eller T-SQL för att lägga till, redigera eller ta bort främmande nycklar.
  • För GUI-verktyg kan du använda SQL Server Management Studio eller dbForge Studio för SQL Server. Båda erbjuder databasscheman och tabell designers för att skapa tabeller med primära och främmande nycklar.
  • CREATE TABLE och ALTER TABLE är lämpliga för att lägga till och ta bort de främmande nycklar.
  • Du kan tillfälligt inaktivera främmande nycklar med nocheck CONSTRAINT i ALTER TABLE. Detta kommer att påskynda massinlägg och uppdateringar. Men se till att göra det möjligt för den tillbaka med kontrollregel.
  • För att undvika gotchas med främmande nycklar, se till att följa rätt ordning. För INSERT och UPDATE sätter först in den överordnade tabellen, sedan in i barn bord. För Radera, Radera barnet poster först, sedan delete moder poster.

Vill du lägga till något för att hjälpa nybörjare huvud främmande nycklar? Kommentarer sektionen är öppen för dina ljusa idéer. Om du gillar det här inlägget, vänligen dela det på din favorit sociala medierna.


  1. Inget sådant kolumn sqlite undantag

  2. Simulera group_concat MySQL-funktion i Microsoft SQL Server 2005?

  3. Hur man genererar ett slumptal inom ett specificerat intervall i SQLite

  4. En begränsning som bara tillåter en av två tabeller att referera till en bastabell