Сценарий:
Вие работите като разработчик на SQL Server, трябва да създадете таблица dbo.Customer със съставен първичен ключ, като използвате колони FName и SSN. След като приключите със създаването на първичен ключ в таблицата dbo.Customer, трябва да създадете втора таблица dbo.Orders и да създадете ограничение за външен ключ, като използвате колони с първичен ключ.Решение:
Нека създадем таблицата dbo.Customer със съставен първичен ключ, като използваме скрипта по-долу.USE YourDatabaseName
GO
CREATE TABLE dbo.Customer (
Customerid INT Identity(1,1)
,FName VARCHAR(100) Not Null
,LName VARCHAR(100)
,SSN VARCHAR(10) Not Null,
Constraint Pk_FName_SSN Primary Key (FName,SSN)
) Забележете, че използваме първичен ключ на име на ограничение (Column1, Column2), както е маркирано в зелено, за да създадем композитен първичен ключ.
Нека създадем dbo.Orders таблица с помощта на скрипта по-долу.
CREATE TABLE dbo.Orders (
OrderId INT Identity(1, 1)
,OrderitemName VARCHAR(50)
,OrderItemAmt INT
,FirstName VARCHAR(100),
SSN VARCHAR(10) Not Null,
Constraint Fk_Order_Customer_FName_SSN
FOREIGN KEY (FirstName,SSN) REFERENCES dbo.Customer(FName,SSN)
) За да създадете ограничение на външния ключ с множество колони, ще използвате скрипт, както е подчертано в зелено. Ще кажете Constraint Constraint_Name Външен ключ(Column1,Column2) Препратки dbo.PrimaryKeyTable(PrimaryKeyColumn1,PrimaryKeyColumn2)
Можете да видите, че в dbo.Orders имам колони FirstName вместо C име в таблицата dbo. Това означава, че не е нужно да имате едно и също име на колона в двете таблици, когато създавате препратка към външен ключ.
Нека вмъкнем записи във всяка таблица и да видим дали всичко работи добре с външния ключ Ограничение.
INSERT INTO dbo.Customer
(FName, LName,SSN)
values
('Aamir','Shahzad','000-000-01')
INSERT INTO dbo.Orders
(OrderItemName,OrderItemAmt,FirstName,SSN)
values ('TV',1,'Aamir','000-000-01') Записите са въведени успешно. Нека проверим, като използваме Select query
![]() |
| Как да създадете ограничение на външния ключ върху множество колони в таблица на SQL Server |
Нека се опитаме да вмъкнем стойност в dbo.Orders, която не съществува в dbo.Customer. Би трябвало чрез нас като грешка поради ограничение на външния ключ.
INSERT INTO dbo.Orders
(OrderItemName,OrderItemAmt,FirstName,SSN)
values ('TV',1,'Aamir','000-000-02') Тъй като подчертаната стойност на SSN не съществува в dbo.Customer, получихме грешка по-долу.
Съобщение 547, ниво 16, състояние 0, ред 30 Инструкцията INSERT е в конфликт с ограничението FOREIGN KEY "Fk_Order_Customer_FName_SSN". Конфликтът е възникнал в базата данни "YourDatabaseName", таблица "dbo.Customer". Изявлението е прекратено.
*** Редът на колоните трябва да бъде същият, който имате в първичния ключ, когато създаваме ограничение за външен ключ. Ако се опитам да създам ограничение на външния ключ с различен ред, ще получа грешка по-долу.
CREATE TABLE dbo.Orders (
OrderId INT Identity(1, 1)
,OrderitemName VARCHAR(50)
,OrderItemAmt INT
,FirstName VARCHAR(100),
SSN VARCHAR(10) Not Null,
Constraint Fk_Order_Customer_FName_SSN
FOREIGN KEY (SSN,FirstName) REFERENCES dbo.Customer(SSN,FName)
) Msg 1776, ниво 16, състояние 0, ред 13 Няма първични или кандидат ключове в посочената таблица 'dbo.Customer', които съответстват на списъка с референтни колони във външния ключ 'Fk_Order_Customer_FName_SSN'. Msg 1750, Level 0, 16, 13 Не можа да се създаде ограничение или индекс. Вижте предишни грешки.
Видео демонстрация:Как да създадете ограничение на външния ключ върху множество колони в SQL Server
