Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como criar restrição de chave estrangeira em várias colunas no SQL Server - SQL Server / TSQL Tutorial Part 67

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