Tình huống:
Bạn đang làm việc với tư cách là nhà phát triển SQL Server, bạn cần tạo một bảng dbo.Customer với khóa chính tổng hợp bằng cách sử dụng cột FName và SSN. Một là bạn đã hoàn tất việc tạo khóa chính trong bảng dbo. Khách hàng, bạn cần tạo bảng thứ hai dbo.Orders và tạo ràng buộc khóa ngoại bằng cách sử dụng các cột Khóa chính.Giải pháp:
Hãy tạo bảng dbo.Customer với khóa chính tổng hợp bằng cách sử dụng tập lệnh bên dưới.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) )
Lưu ý rằng chúng ta đã sử dụng Constraint Constraint_Name Primary Key (Column1, Column2) được đánh dấu bằng màu xanh lục để tạo Composite Primary Key.
Hãy tạo dbo. bảng bằng cách sử dụng tập lệnh bên dưới.
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) )
Để tạo Ràng buộc khóa ngoại với nhiều cột, bạn sẽ sử dụng tập lệnh được đánh dấu bằng màu xanh lá cây. Bạn sẽ nói Constraint Constraint_Name Foreign Key (Column1, Column2) References dbo.PrimaryKeyTable (PrimaryKeyColumn1, PrimaryKeyColumn2)
Bạn có thể thấy rằng Trong dbo.Orders, tôi có cột FirstName thay vì FName mà tôi có trong bảng dbo.Customer. Có nghĩa là bạn không cần phải có cùng tên cột trong cả hai bảng khi tạo tham chiếu khóa ngoại.
Hãy chèn một bản ghi vào mỗi bảng và xem liệu tất cả có hoạt động tốt với Khóa ngoại hay không. Ràng buộc.
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')Bản ghi được chèn thành công. Hãy xác minh bằng cách sử dụng truy vấn Chọn
Cách tạo Ràng buộc khóa ngoại trên nhiều cột trong bảng SQL Server |
Hãy thử chèn một giá trị vào dbo.Orders không tồn tại trong dbo.Customer. Chúng tôi nên thông qua chúng tôi là lỗi do ràng buộc Khoá ngoại.
INSERT INTO dbo.Orders (OrderItemName,OrderItemAmt,FirstName,SSN) values ('TV',1,'Aamir','000-000-02')
Vì giá trị SSN được đánh dấu không tồn tại trong dbo.Customer, chúng tôi đã gặp lỗi bên dưới.
Msg 547, Level 16, State 0, Line 30 Câu lệnh INSERT xung đột với ràng buộc FOREIGN KEY "Fk_Order_Customer_FName_SSN". Xung đột xảy ra trong cơ sở dữ liệu "YourDatabaseName", bảng "dbo.Customer". Câu lệnh đã bị chấm dứt. Thứ tự của các cột phải giống với thứ tự bạn có trong khóa chính khi chúng tôi tạo ràng buộc khóa ngoại. Nếu tôi cố gắng tạo ràng buộc khóa ngoại với thứ tự khác, tôi sẽ gặp lỗi dưới đây.
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 13Không có khóa chính hoặc ứng viên nào trong bảng tham chiếu 'dbo.Customer' khớp với danh sách cột tham chiếu trong khóa ngoại 'Fk_Order_Customer_FName_SSN'.Msg 1750, Level 16, State 0, Line 13 Không thể tạo ràng buộc hoặc chỉ mục. Xem các lỗi trước đó.
Video Demo:Cách tạo Ràng buộc Khoá Ngoại trên Nhiều Cột trong SQL Server