Cenário:
Você está trabalhando como desenvolvedor do SQL Server, você precisa criar uma tabela dbo.Customer com chave primária composta usando as colunas FName e SSN. Quando você terminar de criar a chave primária na tabela dbo.Customer, você precisará criar a segunda tabela dbo.Orders e criar uma restrição de chave estrangeira usando colunas de chave primária.Solução:
Vamos criar a tabela dbo.Customer com chave primária composta usando o script abaixo.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)
) Observe que usamos a Constraint Constraint_Name Primary Key(Column1, Column2) destacada em verde para criar a Composite Primary Key.
Vamos criar o dbo.Orders tabela usando o script abaixo.
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)
) Para criar uma restrição de chave estrangeira com várias colunas, você usará o script destacado em verde. Você dirá Constraint Constraint_Name Foreign Key(Column1,Column2) Referências dbo.PrimaryKeyTable(PrimaryKeyColumn1,PrimaryKeyColumn2)
Você pode ver que em dbo.Orders, tenho colunas FirstName em vez de FName que tenho na tabela dbo.Customer. Isso significa que você não precisa ter o mesmo nome de coluna em ambas as tabelas quando estiver criando uma referência de chave estrangeira.
Vamos inserir um registro em cada uma das tabelas e ver se tudo está funcionando bem com a Chave Estrangeira Restrição.
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') Os registros são inseridos com sucesso. Vamos verificar usando Select query
![]() |
| Como criar restrição de chave estrangeira em várias colunas na tabela do SQL Server |
Vamos tentar inserir um valor em dbo.Orders que não existe em dbo.Customer. Deve passar por nós como erro devido à restrição de chave estrangeira.
INSERT INTO dbo.Orders
(OrderItemName,OrderItemAmt,FirstName,SSN)
values ('TV',1,'Aamir','000-000-02') Como o valor SSN destacado não existe em dbo.Customer, obtivemos o erro abaixo.
Msg 547, Level 16, State 0, Line 30A instrução INSERT entrou em conflito com a restrição FOREIGN KEY "Fk_Order_Customer_FName_SSN". O conflito ocorreu no banco de dados "YourDatabaseName", tabela "dbo.Customer". A instrução foi finalizada.
*** A ordem das colunas deve ser a mesma que você tem na chave primária quando criamos a restrição de chave estrangeira. Se eu tentar criar restrição de chave estrangeira com ordem diferente, obterei o erro abaixo.
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, Level 16, State 0, Line 13Não há chaves primárias ou candidatas na tabela referenciada 'dbo.Customer' que correspondam à lista de colunas de referência na chave estrangeira 'Fk_Order_Customer_FName_SSN'.Msg 1750, Level 16, State 0, Line 13Não foi possível criar restrição ou índice. Veja os erros anteriores.
Demonstração em vídeo:como criar restrição de chave estrangeira em várias colunas no SQL Server
