Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да създадете ограничение на външния ключ върху множество колони в SQL Server - SQL Server / TSQL урок, част 67

Сценарий:

Вие работите като разработчик на 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







  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Използване на схеми на база данни в SQL Server

  2. Предайте речник<string,int> към T-SQL за съхранявана процедура

  3. Преобразувайте „datetime“ в „date“ в SQL Server (T-SQL примери)

  4. Как да намеря границите на групи от последователни последователни числа?

  5. Може ли външният ключ да бъде NULL и/или дублиран?