Sök…


Utländska nyckelförhållanden / begränsning

Med främmande nycklar kan du definiera förhållandet mellan två tabeller. En (överordnad) tabell måste ha en primär nyckel som unikt identifierar rader i tabellen. En annan (barn) -tabell kan ha värdet på den primära nyckeln från föräldern i en av kolumnerna. Utländska nyckelreferenser begränsning säkerställer att värden i underordnad tabell måste finnas som ett primärt nyckelvärde i överordnad tabell.

I det här exemplet har vi moderbolagstabell med CompanyId-primärnyckel och barnanställdstabell som har id för företaget där den anställd arbetar.

create table Company (
   CompanyId int primary key,
   Name nvarchar(200)
)
create table Employee (
    EmployeeId int,
    Name nvarchar(200),
    CompanyId int
        foreign key references Company(companyId)
)

utländska nyckelreferenser säkerställer att värden infogade i kolumnen Employee.CompanyId måste också finnas i kolumnen Company.CompanyId. Ingen kan också ta bort företag i företagstabellen om det finns åtminstone en anställd med ett matchande företagId i barntabell.

Utländsk nyckelförhållande säkerställer att rader i två tabeller inte kan "avlänkas".

Upprätthålla förhållandet mellan föräldrar / barnrader

Låt oss anta att vi har en rad i företagstabell med företagId 1. Vi kan infoga rad i medarbetartabell som har företagId 1:

insert into Employee values (17, 'John', 1)

Vi kan dock inte sätta in anställda som inte har ett befintligt företagId:

insert into Employee values (17, 'John', 111111)

Msg 547, Level 16, State 0, Line 12 INSERT-uttalandet strider mot den utländska nyckelbegränsningen "FK__Employee__Compan__1EE485AA". Konflikten inträffade i databasen "MyDb", tabellen "dbo.Company", kolumnen "CompanyId". Uttalandet har avslutats.

Vi kan inte heller ta bort överordnade rader i företagstabellen så länge det finns minst en underordnad rad i medarbetartabellen som refererar till den.

delete from company where CompanyId = 1

Msg 547, nivå 16, tillstånd 0, rad 14 UTSLAGANDE uttalandet strider mot REFERENCE-begränsningen "FK__Employee__Compan__1EE485AA". Konflikten inträffade i databasen "MyDb", tabellen "dbo.Employee", kolumnen "CompanyId". Uttalandet har avslutats.

Utländska nyckelförhållanden säkerställer att raderna för företag och medarbetare inte "kopplas samman".

Lägga till utländska nyckelförhållanden på befintliga tabeller

Utländsk nyckelbegränsning kan läggas till på befintliga tabeller som fortfarande inte är i relation. Föreställ dig att vi har företag och anställda tabeller där anställd tabell Företag kolumn men inte har utländska nyckelförhållanden. Med ALTER TABLE-sats kan du lägga till främmande nyckelbegränsningar i en befintlig kolumn som refererar till någon annan tabell och primärnyckel i den tabellen:

alter table Employee
    add  foreign key (CompanyId) references Company(CompanyId)

Lägg till utländsk nyckel på befintligt bord

Utländska nyckelkolumner med begränsning kan läggas till på befintliga tabeller som fortfarande inte är i relation. Föreställ dig att vi har företags- och medarbetartabeller där medarbetartabellen inte har kolumnen CompanyId. Med ALTER TABLE-sats kan du lägga till en ny kolumn med främmande nyckelbegränsningar som hänvisar till någon annan tabell och primär nyckel i den tabellen:

alter table Employee
    add CompanyId int foreign key references Company(CompanyId)

Få information om utländska nyckelbegränsningar

sys.foreignkeys systemvy ger information om alla utländska nyckelförhållanden i databasen:

select name,
 OBJECT_NAME(referenced_object_id) as [parent table],
 OBJECT_NAME(parent_object_id) as [child table],
 delete_referential_action_desc,
 update_referential_action_desc
from sys.foreign_keys


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow