Cách kiểm tra khóa ngoại trong SQL

Các khóa ngoại FOREIGN KEY nhằm tạo ra các mối liên kết giữa các bảng với nhau. Một khóa ngoại FOREIGN KEY là một trường (hoặc tập hợp các trường) trong một bảng, tham chiếu đến khóa chính PRIMARY KEY trong một bảng khác. Bảng có khóa ngoại FOREIGN KEY được gọi là bảng con và bảng có khóa chính PRIMARY KEY được gọi là bảng tham chiếu hoặc bảng cha.

Để dễ hình dung, tôi sẽ có bảng là: KhachHang(KhachHang_ID,Ho,Ten,Tuoi) bảng này sẽ có khóa chính là KhachHang_ID

KhachHang_IDHoTenTuoi1ChuMinh Nam202NguyễnTrí Thành193PhùngThái Sơn20

Bảng tiếp theo là bảng DatHang(MaDH, SoLuong, KhachHang_ID) bảng này sẽ có khóa chính là MaDH và có thêm cột KhachHang_ID làm khóa ngoại liên kết hay tham chiếu đến khóa chính KhachHang_ID của bảng KhachHang(KhachHang_ID,Ho,Ten,Tuoi)

MaDHSoLuongKhachHang_ID11233234533567247891

Sau khi bảng DatHang được tạo ra và tham chiếu khóa ngoại tới bảng KhachHang bằng thuộc tính KhachHang_ID thì ta hoàn toàn có thể biết được rằng các đơn hàng trong bảng DatHang do ai là người đặt và có thể lấy ra thông tin ID, Họ tên, tuổi của người đặt hàng trong bảng KhachHang

2. Tạo khóa ngoại bằng FOREIGN KEY

Để tạo một khóa ngoại trong câu lệnh tạo bảng, ta sẽ sử dụng cú pháp như sau:

CREATE TABLE table_name (
    column1 datatype PRIMARY KEY,
    column2 datatype,
    column3 datatype FOREIGN KEY REFERENCES table_name_pk(column_pk),
    ....
);

Nếu như bạn muốn tạo một khóa ngoại trong câu lệnh tạo bảng và đặt tên cho khóa ngoại đó thì có thể sử dụng câu lệnh như sau:

CREATE TABLE table_name (
    column1 datatype,
    column2 datatype,
    column3 datatype,
    PRIMARY KEY (column),
    CONSTRAINT name FOREIGN KEY (column)
    REFERENCES table_name_pk (column_pk)
    ....
);

Trong đó:

  • CREATE TABLE là câu lệnh hay từ khóa cần có
  • table_name là tên của bảng cần tạo
  • column1, column2, column3… là tên các cột thuộc trong bảng
  • datatype là kiểu dữ liệu của từng cột
  • PRIMATY KEY là khóa chính cho cột
  • name là tên của khóa ngoại FOREIGN KEY do ta tự đặt
  • REFERENCES table_name_pk(column_pk) chỉ định khóa ngoại sẽ tham chiếu đến bảng và cột cần liên kết.

Để bổ xung một khóa ngoại vào trong bảng đã có sẵn, ta sẽ dùng câu lệnh như sau:

ALTER TABLE table_name
ADD CONSTRAINT name
FOREIGN KEY (column) REFERENCES table_name_pk(column_pk);

Để xóa đi một khóa ngoại đã có sẵn trong bảng ta sẽ sử dụng câu lệnh sau:

ALTER TABLE table_name
DROP CONSTRAINT name;

Trong câu lệnh xóa đi khóa ngoại ta cần phải biết được name chính là tên của khóa ngoại mà ta đã đặt cho nó.

3. Ví dụ FOREIGN KEY

Ví dụ này tôi sẽ tạo ra bảng có tên là KhachHang gồm các cột là: KhachHang_ID,Ho,Ten,Tuoi khóa chính cho bảng này sẽ là KhachHang_ID

CREATE TABLE KhachHang (
    KhachHang_ID int NOT NULL PRIMARY KEY,
    Ho varchar(25) NOT NULL,
    Ten varchar(25) NOT NULL,
    Tuoi int
);

Tiếp theo, tôi sẽ tạo ra bảng có tên là DatHang gồm các cột là: MaDH, SoLuong, KhachHang_ID bảng này sẽ có khóa chính là MaDH và có khóa ngoại là cột KhachHang_ID sẽ kết nối hay liên kết tới cột KhachHang_ID của bảng KhachHang. Tôi sẽ đặt tên cho khóa ngoại này là PK_KhachDat

CREATE TABLE DatHang(
    MaDH int NOT NULL,
    SoLuong varchar(25) NOT NULL,
    KhachHang_ID int NOT NULL,
    PRIMARY KEY (MaDH),
    CONSTRAINT PK_KhachDat FOREIGN KEY (KhachHang_ID)
    REFERENCES KhachHang(KhachHang_ID)
);

Dưới đây là mối liên kết giữa hai bảng được biểu diễn thông qua Database Diagrams

Cách kiểm tra khóa ngoại trong SQL

Để thực hiện xóa đi mối liên kết này ta sẽ sử dụng câu lệnh như sau:

ALTER TABLE DatHang
DROP CONSTRAINT PK_KhachDat;

Chú ý: Khi bảng có khóa ngoại làm tham chiếu đến bảng cha thì dữ liệu của bảng con có khóa ngoại sẽ được xuất hiện trong bảng cha được tham chiếu.

Một bảng chỉ có thể có MỘT khóa chính và trong bảng, khóa chính này có thể bao gồm một hoặc nhiều cột (trường).

Ví dụ:

  • SQL PRIMARY KEY trong CREATE TABLE

SQL sau tạo một KHÓA CHÍNH trên cột “ID” khi bảng “Persons” được tạo:

MySQL:

/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: [email protected]
Fanpage: https://www.facebook.com/cafedevn
Group: https://www.facebook.com/groups/cafedev.vn/
Instagram: https://instagram.com/cafedevn
Twitter: https://twitter.com/CafedeVn
Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
Pinterest: https://www.pinterest.com/cafedevvn/
YouTube: https://www.youtube.com/channel/UCE7zpY_SlHGEgo67pHxqIoA/
*/

CREATE TABLE Persons (
    ID int NOT NULL,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Age int,
    PRIMARY KEY (ID)
); 

SQL Server / Oracle / MS Access:

CREATE TABLE Persons (
    ID int NOT NULL PRIMARY KEY,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Age int
); 

Để cho phép đặt tên cho ràng buộc KHÓA CHÍNH và để xác định ràng buộc KHÓA CHÍNH trên nhiều cột, hãy sử dụng cú pháp SQL sau:

MySQL / SQL Server / Oracle / MS Access:

CREATE TABLE Persons (
    ID int NOT NULL,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Age int,
    CONSTRAINT PK_Person PRIMARY KEY (ID,LastName)
); 

Lưu ý: Trong ví dụ trên chỉ có MỘT KHÓA CHÍNH (PK_Person). Tuy nhiên, GIÁ TRỊ của khóa chính được tạo thành từ HAI CỘT (ID + LastName).

  • SQL PRIMARY KEY trong ALTER TABLE

Để tạo ràng buộc CHÍNH CHÍNH trên cột “ID” khi bảng đã được tạo, hãy sử dụng SQL sau:

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Persons
ADD PRIMARY KEY (ID);

Để cho phép đặt tên cho ràng buộc KHÓA CHÍNH(PRIMARY KEY) và để xác định ràng buộc KHÓA CHÍNH(PRIMARY KEY) trên nhiều cột, hãy sử dụng cú pháp SQL sau:

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Persons
ADD CONSTRAINT PK_Person PRIMARY KEY (ID,LastName); 

Lưu ý: Nếu bạn sử dụng câu lệnh ALTER TABLE để thêm khóa chính, (các) cột khóa chính phải được khai báo không chứa giá trị NULL (khi bảng được tạo lần đầu tiên).

  • Xoá PRIMARY KEY Constraint

Để loại bỏ ràng buộc Khoá CHÍNH, hãy sử dụng SQL sau:

MySQL:

ALTER TABLE Persons
DROP PRIMARY KEY; 

SQL Server / Oracle / MS Access:

ALTER TABLE Persons
DROP CONSTRAINT PK_Person;

2. Khoá ngoại(FOREIGN KEY) trong SQL

KEY FOREIGN là một khóa ngoại dùng để liên kết hai bảng với nhau.

KHÓA NGOẠI là một trường (hoặc tập hợp các trường) trong một bảng tham chiếu đến KHÓA CHÍNH trong một bảng khác.

Bảng chứa khóa ngoại được gọi là bảng con và bảng chứa khóa ứng viên được gọi là bảng tham chiếu hoặc bảng cha.

Nhìn vào hai bảng sau:

Bảng Persons:

PersonIDLastNameFirstNameAge1HOÁTINH302LANTƯỚNG233XUÂNTÁ20

Bảng Orders:

OrderIDOrderNumberPersonID1778953244678332245624245621

Lưu ý rằng cột “PersonID” trong bảng “Order” trỏ đến cột “PersonID” trong bảng “Person”.

Cột “PersonID” trong bảng “Person” là TỪ KHÓA CHÍNH() trong bảng “Person”.

Cột “PersonID” trong bảng “Đơn hàng” là một TỪ KHÓA NGOẠI TỆ trong bảng “Đơn hàng”.

Ràng buộc FOREIGN KEY được sử dụng để ngăn chặn các hành động phá hủy liên kết giữa các bảng.

Ràng buộc NGOẠI KHÓA cũng ngăn không cho dữ liệu không hợp lệ được chèn vào cột khóa ngoại, vì nó phải là một trong những giá trị có trong bảng mà nó trỏ tới.

  • SQL FOREIGN KEY trong CREATE TABLE

SQL sau tạo một TỪ KHÓA NGOẠI trên cột “PersonID” khi bảng “Orders” được tạo:

MySQL:

CREATE TABLE Orders (
    OrderID int NOT NULL,
    OrderNumber int NOT NULL,
    PersonID int,
    PRIMARY KEY (OrderID),
    FOREIGN KEY (PersonID) REFERENCES Persons(PersonID)
); 

SQL Server / Oracle / MS Access:

CREATE TABLE Orders (
    OrderID int NOT NULL PRIMARY KEY,
    OrderNumber int NOT NULL,
    PersonID int FOREIGN KEY REFERENCES Persons(PersonID)
); 

Để cho phép đặt tên cho ràng buộc NGOẠI KHÓA và để xác định ràng buộc NGOẠI KHÓA trên nhiều cột, hãy sử dụng cú pháp SQL sau:

MySQL / SQL Server / Oracle / MS Access:

/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: [email protected]
Fanpage: https://www.facebook.com/cafedevn
Group: https://www.facebook.com/groups/cafedev.vn/
Instagram: https://instagram.com/cafedevn
Twitter: https://twitter.com/CafedeVn
Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
Pinterest: https://www.pinterest.com/cafedevvn/
YouTube: https://www.youtube.com/channel/UCE7zpY_SlHGEgo67pHxqIoA/
*/

CREATE TABLE Orders (
    OrderID int NOT NULL,
    OrderNumber int NOT NULL,
    PersonID int,
    PRIMARY KEY (OrderID),
    CONSTRAINT FK_PersonOrder FOREIGN KEY (PersonID)
    REFERENCES Persons(PersonID)
);
  • SQL FOREIGN KEY trong ALTER TABLE

Để tạo ràng buộc NGOẠI KHÓA trên cột “PersonID” khi bảng “Orders” đã được tạo, hãy sử dụng SQL sau:

MySQL / SQL Server / Oracle / MS Access:

CREATE TABLE Persons (
    ID int NOT NULL PRIMARY KEY,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Age int
); 
0

Để cho phép đặt tên cho ràng buộc NGOẠI KHÓA và để xác định ràng buộc NGOẠI KHÓA trên nhiều cột, hãy sử dụng cú pháp SQL sau:

MySQL / SQL Server / Oracle / MS Access:

CREATE TABLE Persons (
    ID int NOT NULL PRIMARY KEY,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Age int
); 
1
  • Xoá FOREIGN KEY Constraint

Để loại bỏ ràng buộc NGOẠI KHÓA, hãy sử dụng SQL sau:

MySQL:

CREATE TABLE Persons (
    ID int NOT NULL PRIMARY KEY,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Age int
); 
2

SQL Server / Oracle / MS Access:

CREATE TABLE Persons (
    ID int NOT NULL PRIMARY KEY,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Age int
); 
3

Full series tự học SQL từ cơ bản tới nâng cao tại đây nha.

Nếu bạn thấy hay và hữu ích, bạn có thể tham gia các kênh sau của cafedev để nhận được nhiều hơn nữa: