Ràng buộc khóa ngoại lai (FOREIGN KEY) trong SQL
Khóa ngoại lai trong một bảng trỏ tới một khóa chính trong một bảng khác. Hay nói cách khác khóa ngoại lai dùng để liên kết hai bảng với nhau.
Khóa ngoại lai giúp đảm bảo tính toàn vẹn tham chiếu dữ liệu, tức là không có trường hợp tham chiếu tới dữ liệu không tồn tại trong cơ sở dữ liệu.
Xét ví dụ sau:
Bảng “Persons”
PID |
LastName |
FirstName |
Address |
City |
1 |
Nguyen |
Phi |
My Dinh |
Ha Noi |
2 |
Ngoc |
Ha |
Ba Trieu |
Ha Noi |
3 |
Tran |
Van |
Hai Ba Trung |
Ha Noi |
Bảng “Orders”
OID |
Order_No |
PID |
1 |
532 |
3 |
2 |
457 |
3 |
3 |
890 |
2 |
4 |
334 |
1 |
Chú ý:
-
Cột “PID” trong bảng “Orders” trỏ tới cột “PID” trong bảng “Persons”
-
Cột “PID” trong bảng “Persons” là khóa chính (PRIMARY KEY) trong bảng đó
-
Cột “PID” trong bảng “Orders” là khóa ngoại lai (FOREIGN KEY) trong bảng “Orders”
-
Ràng buộc khóa ngoại lại được sử dụng để ngăn chặn những hành động làm phá hỏng sự liên kết giữa các bảng với nhau
-
Ràng buộc khóa ngoại lai (FOREIGN KEY) cũng có tác dụng để ngăn chặn việc chèn những dữ liệu không chính xác tới cột khóa ngoại lai, bởi vì chúng phải là một trong những dữ liệu được chứa trong bảng mà nó trỏ tới
-
Khóa ngoại phải có cùng kiểu dữ liệu, cùng số lượng trường có sắp xếp tương ứng khóa chính
Tạo khóa ngoại lai trong lúc tạo bảng
Cú pháp MYSQL:
CREATE TABLE Orders
(
OID INT NOT NULL,
Order_No INT NOT NULL,
PID INT,
PRIMARY KEY (OID),
FOREIGN KEY (PID) REFERENCES Persons(PID)
)
Cú pháp SQL Server/ Oracle/ MS Access:
CREATE TABLE Orders
(
OID INT NOT NULL PRIMARY KEY,
Order_No INT NOT NULL,
PID INT FOREIGN KEY (PID) REFERENCES Persons(PID)
)
Đặt tên cho khóa ngoại lai
Tương tự khóa chính, khóa ngoại lai cũng đặt tên thông qua từ khóa CONSTRAINT.
Quy tắc đặt tên khóa ngoại lai:
Tên khóa ngoại lai: FK_<Table Foregin>
Để đặt tên cho một ràng buộc khóa ngoại lai (FOREIGN KEY), và để định nghĩa một ràng buộc khóa ngoại lai trên nhiều cột, sử dụng cú pháp sau:
CREATE TABLE Orders
(
OID INT NOT NULL,
Order_No INT NOT NULL,
PID INT,
PRIMARY KEY (OID),
CONSTRAINT FK_Orders FOREIGN KEY(PID) REFERENCES Persons (PID)
)
Tạo khóa ngoại lai sau khi tạo bảng
Cú pháp:
ALTER TABLE <Table Foreign>
ADD FOREIGN KEY(<ColumF, ColumF1, ColumF2,…>)
REFERENCES <Table Key> <Table Primary>(<ColumP, ColumnP1, ColumP2,…>)
Ví dụ:
MYSQL/ SQL Server/ Oracle/ MS Access:
ALTER TABLE Orders
ADD FOREIGN KEY(PID)
REFERENCES Persons (PID)
Để cho phép đặt tên khóa ngoại lai và định nghĩa ràng buộc khóa ngoại lai trên nhiều cột (sau khi bảng đã được tạo) sử dụng cú pháp sau:
MYSQL/ SQL Server/ Oracle/ MS Access:
ALTER TABLE Orders
ADD CONSTRAINT FK_Orders
FOREIGN KEY (PID)
REFERENCES Persons(PID)
Hủy (DROP) ràng buộc khóa ngoại lai
Cú pháp MYSQL:
ALTERTABLE<Tên bảng ngoại lai> DROPFOREIGN KEY<Tên khóa ngoại lai> |
Cú pháp SQL Server/ Oracle/ MS Access:
ALTERTABLE<Tên bảng ngoại lai> DROPCONSTRAINT<Tên khóa ngoại lai> |
Ví dụ:
MYSQL:
ALTER TABLE Orders DROP FOREIGN KEY FK_Orders
SQL Server/ Oracle/ MS Access:
ALTER TABLE Orders DROP CONSTRAINT FK_Orders
Chú ý:
Trong thiết kế một database cho web hay một ứng dụng lớn, ta thường tránh sử dụng nhiều ràng buộc khóa ngoại lai vì nó sẽ làm giảm tốc độ thực thi, truy vấn. Tuy nhiên để giảm được số lượng ràng buộc khóa ngoại lai thì người thiết kế cần tối ưu thiết kế database tốt. Bởi vì nếu bỏ ràng buộc FOREIGN KEY sẽ ảnh hưởng tới tính toàn vẹn tham chiếu. Tùy theo mục đích thiết kế mà bạn đề cao tính an toàn hay đề cao tốc độ hơn để có thể quyết định được thiết kế của mình.