Hệ quản trị SQL Server - Khóa ngoại trong SQL

Khóa ngoại trong SQL Server là gì?

Khóa ngoại được dùng để tăng tính tham chiếu trong cơ sở dữ liệu SQL Server. Khóa ngoại nghĩa là giá trị trong bảng này phải xuất hiện trong bảng khác.

Bảng tham chiếu gọi là bảng mẹ, còn bảng chứa khóa ngoại gọi là bảng con. Khóa ngoại trong bảng con thường tham chiếu tới khóa chính PRIMARY KEY trong bảng mẹ.

Khóa ngoại có thể được tạo bằng lệnh CREATE TABLE hoặc lệnh ALTER TABLE.

Cú pháp:

CREATE TABLE bang_con
 (
  cot1 kieudulieu [ NULL | NOT NULL ],
  cot2 kieudulieu [ NULL | NOT NULL ],
  …
 
  CONSTRAINT fk_ten
   FOREIGN KEY (cot_con1, cot_con2, … cot_con_n)
   REFERENCES bang_me (cot_me1, cot_me2, … cot_me_n)
   [ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
   [ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
 );

Giải thích các tham số trên

bang_con

Tên của bảng con muốn tạo.

cot1, cot2

Cột muốn tạo trong bảng. Mỗi cột có 1 loại dữ liệu, phải được chỉ định là chứa giá trị NULL hay NOT NULL, nếu không sẽ mặc định là NULL.

fk_ten

Tên của ràng buộc khóa ngoại muốn tạo.

cot_con1, cot_con2, … cot_con_n

Cột trong bang_con muốn tham chiếu tới khóa chính trong bang_me.

bang_me

Tên của bảng mẹ chứa khóa chính được dùng trong bang_con.

cot_me1, cot_me2, … cot_me_n

Cột tạo nên khóa chính trong bang_me. Khóa ngoại sẽ tạo ràng buộc giữa dữ liệu và các cột cot_con1, cot_con2, … cot_con_n trong bang_con.

ON DELETE

Tùy chọn. Cho biết sẽ làm gì với dữ liệu con khi dữ liệu mẹ bị xóa. Có các lựa chọn NO ACTION, CASCADE, SET NULL và SET DEFAULT.

ON UPDATE

Tùy chọn. Cho biết sẽ làm gì với dữ liệu con khi dữ liệu mẹ được cập nhật. Có các lựa chọn NO ACTION, CASCADE, SET NULL và SET DEFAULT.

NO ACTION

Dùng với ON DELETE hoặc ON UPDATE, nghĩa là không làm gì với dữ liệu con khi dữ liệu mẹ bị xóa hoặc cập nhật.

CASCADE

Dùng với ON DELETE hoặc ON UPDATE, nghĩa là dữ liệu con bị xóa hoặc cập nhật khi dữ liệu mẹ bị xóa hoặc cập nhật.

SET NULL

Dùng với ON DELETE hoặc ON UPDATE, nghĩa là dữ liệu con được đặt là NULL khi dữ liệu mẹ bị xóa hoặc cập nhật.

SET DEFAULT

Dùng với ON DELETE hoặc ON UPDATE, nghĩa là dữ liệu con được đặt thành giá trị mặc định khi dữ liệu mẹ bị xóa hoặc cập nhật.

  • Khóa ngoại Foreign Key (Cascade Delete) trong SQL Server
  • Khóa ngoại Foreign Key (Set Null) trong SQL Server 

Ví dụ :

Chúng ta sẽ hai bảng "products" và  "inventory". Trong bảng "products" có khóa chính là "product_id" cũng là khóa ngoại trong bảng  "inventory".

CREATE TABLE products  
( product_id INT PRIMARY KEY,  
  product_name VARCHAR(50) NOT NULL,  
  category VARCHAR(25)  
);  
CREATE TABLE inventory  
( inventory_id INT PRIMARY KEY,  
  product_id INT NOT NULL,  
  quantity INT,  
  min_level INT,  
  max_level INT,  
  CONSTRAINT fk_inv_product_id  
    FOREIGN KEY (product_id)  
    REFERENCES products (product_id)  
);  

Kết quả:

SQL Server foreign key 1

Tên khóa ràng buộc khóa ngoại trong bảng "inventory" là  fk_inv_product_id. Nó sẽ thiết lập quan hệ giữ hai bảng "inventory""products" trên cột product_id.

Chúng ta có thể kiểm tra 2 bảng:.

SQL Server foreign key 2 SQL Server foreign key 3


Tạo khóa ngoại sử dụng nhiều trường

Create foreign key with more than one field

Trong ví dụ trên chúng ta tạo khóa ngoại sử dụng một cột, trong ví dụ sau chúng ta sẽ tạo khóa ngoại nhiều hơn một trường.

Giờ chúng ta tạo hai bảng "products2"  "inventory2". Trong ví dụ này bảng "products2" có khóa chính là hai cột product_name và location. Do đó, bảng thứ hai phải có khóa ngoại là hai cột này

Trong ví dụ này, tên khóa ngoại là fk_inv_product tham chiếu đến bảng products có hai trường: the product_name và location.

CREATE TABLE products2  
( product_name VARCHAR(50) NOT NULL,  
  location VARCHAR(50) NOT NULL,  
  category VARCHAR(25)  
  CONSTRAINT products_pk PRIMARY KEY (product_name, location)  
);  
CREATE TABLE inventory2  
( inventory_id INT PRIMARY KEY,  
  product_name VARCHAR(50) NOT NULL,  
  location VARCHAR(50) NOT NULL,  
  quantity INT,  
  min_level INT,  
  max_level INT,  
  CONSTRAINT fk_inv_product  
    FOREIGN KEY (product_name, location)  
    REFERENCES products2 (product_name, location)  
);  

Kết quả:

SQL Server foreign key 4