Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak utworzyć ograniczenie klucza obcego w wielu kolumnach w SQL Server — samouczek SQL Server/TSQL — część 67

Scenariusz:

Pracujesz jako programista SQL Server, musisz utworzyć tabelę dbo.Customer ze złożonym kluczem podstawowym przy użyciu kolumn FName i SSN. Po zakończeniu tworzenia klucza podstawowego w tabeli dbo.Customer, musisz utworzyć drugą tabelę dbo.Orders i utworzyć ograniczenie klucza obcego za pomocą kolumn klucza podstawowego.

Rozwiązanie:

Utwórzmy tabelę dbo.Customer ze złożonym kluczem podstawowym za pomocą poniższego skryptu.

USE YourDatabaseNameGOCREATE TABLE dbo.Customer ( Customerid INT Identity(1,1) ,FName VARCHAR(100) Not Null ,LName VARCHAR(100) ,SSN VARCHAR(10) nie jest pusty, Ograniczenie Pk_FName_SSN Klucz podstawowy (FName,SSN) )




Zauważ, że użyliśmy Constraint_Name Klucz podstawowy (kolumna1, kolumna2) podświetlony na zielono, aby utworzyć złożony klucz podstawowy.
Utwórzmy dbo.Orders tabeli za pomocą poniższego skryptu.

CREATE TABLE dbo.Orders ( OrderId INT Identity(1, 1) ,OrderitemName VARCHAR(50) ,OrderItemAmt INT ,FirstName VARCHAR(100), SSN VARCHAR( 10) Nie Null, Ograniczenie Fk_Order_Customer_FName_SSN OBCY KLUCZ (Imię,SSN) REFERENCJE dbo.Customer(FName,SSN) )




Aby utworzyć ograniczenie klucza obcego z wieloma kolumnami, użyj skryptu podświetlonego na zielono. Powiesz Constraint Constraint_Name Foreign Key(Column1,Column2) References dbo.PrimaryKeyTable(PrimaryKeyColumn1,PrimaryKeyColumn2)
Widać, że w dbo.Orders mam kolumny FirstName zamiast FName, które mam w tabeli dbo.Customer. Oznacza to, że nie musisz mieć tej samej nazwy kolumny w obu tabelach podczas tworzenia odwołania do klucza obcego.

Wstawmy rekordy w każdej tabeli i zobaczmy, czy wszystkie działają poprawnie z kluczem obcym Ograniczenie.
 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”)
 
 Rekordy zostały wstawione pomyślnie. Zweryfikujmy za pomocą Select query
Jak utworzyć ograniczenie klucza obcego w wielu kolumnach w tabeli SQL Server


Spróbujmy wstawić wartość w dbo.Orders, której nie ma w dbo.Customer. Powinno to przez nas jako błąd z powodu ograniczenia klucza obcego.
 INSERT INTO dbo.Orders (OrderItemName,OrderItemAmt,FirstName,SSN) wartości ('TV',1,'Aamir','000-000- 02')

Ponieważ podświetlona wartość SSN nie istnieje w dbo.Customer, wystąpił błąd poniżej.
Wiadomość 547, poziom 16, stan 0, wiersz 30. Instrukcja INSERT była w konflikcie z ograniczeniem klucza obcego „Fk_Order_Customer_FName_SSN”. Konflikt wystąpił w bazie danych "NazwaBazyDanych", tabela "dbo.Klient". Instrukcja została zakończona.


*** Kolejność kolumn powinna być taka sama jak w kluczu podstawowym, gdy tworzymy ograniczenie klucza obcego. Jeśli spróbuję utworzyć ograniczenie klucza obcego w innej kolejności, otrzymam błąd poniżej.
 CREATE TABLE dbo.Orders ( OrderId INT Identity(1, 1) ,OrderitemName VARCHAR(50) ,OrderItemAmt INT ,FirstName VARCHAR (100) 
 
 Msg 1776, Poziom 16, Stan 0, Wiersz 13 W tabeli „dbo.Customer”, do której istnieje odwołanie, nie ma kluczy podstawowych ani kandydujących, które pasują do listy kolumn odniesienia w kluczu obcym „Fk_Order_Customer_FName_SSN”.Msg 1750, Level 16, State 0, Line 13Nie można utworzyć ograniczenia lub indeksu. Zobacz poprzednie błędy.


Wideo demonstracyjne:Jak utworzyć ograniczenie klucza obcego w wielu kolumnach w 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. Jak naprawić „Lista wyboru dla instrukcji INSERT zawiera mniej elementów niż lista wstawiania”

  2. Jak mogę wywołać procedurę składowaną SQL przy użyciu EntityFramework 7 i Asp.Net 5?

  3. Indeks wznowień programu SQL Server:Czy to jest dla Ciebie dobre?

  4. JSON_QUERY() Przykłady w SQL Server (T-SQL)

  5. Pobieranie wartości zwracanej z JDBC MSSQL