SQL Server cung cấp hai loại ràng buộc quan trọng để thực thi tính toàn vẹn dữ liệu trong các bảng - khóa chính và khóa ngoại. Mặc dù cả hai loại này có vẻ giống nhau, chúng thực tế khác nhau về tính năng và hành vi. Trong bài viết này, chúng ta sẽ tìm hiểu sự khác biệt chính giữa khóa chính và khóa ngoại.
1. Khóa chính là gì
- Khóa chính (hoặc ràng buộc khóa chính) được sử dụng để xác định duy nhất mỗi bản ghi trong bảng dữ liệu.
- Ngoài ra, nó còn được sử dụng để thiết lập quan hệ 1-n (hoặc ràng buộc tham chiếu) giữa hai bảng.
- Giá trị của trường khóa chính phải là duy nhất và không thể chứa giá trị NULL.
- Mỗi bảng nên chỉ có một khóa chính, và khóa chính có thể bao gồm nhiều trường trong bảng.
2. Khóa ngoại là gì
- Khóa ngoại của một bảng đóng vai trò như một con trỏ trỏ tới khóa chính của bảng khác.
- Ví dụ, nếu trường "MaSV" của bảng "DiemSV" được sử dụng để tạo ràng buộc tham chiếu đến bảng "HSSV" thông qua khóa chính "MaSV", thì "MaSV" của bảng "DiemSV" được gọi là khóa ngoại. Đây chính là lý do tại sao khóa ngoại được xem như một con trỏ trỏ tới khóa chính.
- Qua ví dụ sau, chúng ta sẽ hiểu rõ hơn về ý nghĩa sử dụng của khóa chính và khóa ngoại. Giả sử có hai bảng trong cơ sở dữ liệu "QLDiemSV": "HSSV" và "DiemSV".
- Bảng "HSSV" gồm 6 trường, trong đó "MaSV" được chọn làm khóa chính.
- Bảng "DiemSV" gồm 6 trường, trong đó "STT" là khóa chính và "MaSV" được chọn làm khóa ngoại của bảng này.
Như vậy, hai bảng "HSSV" và "DiemSV" có quan hệ dữ liệu với nhau thông qua trường "MaSV" (quan hệ 1-n). Ràng buộc tham chiếu đã được tạo giữa hai bảng này, ngăn chặn việc hủy các liên kết và ngăn chặn việc nhập giá trị không tồn tại trong bảng khóa chính (ví dụ: không thể nhập điểm cho một sinh viên vào bảng "DiemSV" nếu mã sinh viên đó không tồn tại trong cột "MaSV" của bảng "HSSV").
3. Thiết lập khóa chính
- Để tạo khóa chính khi tạo bảng, chúng ta có thể sử dụng câu lệnh SQL
CREATE TABLE
như sau:
CREATE TABLE HSSV (
MaSV varchar(8) NOT NULL,
Holot varchar(20),
Ten varchar(8),
NgaySinh Date,
MaLop varchar(8) NOT NULL,
Lienhe varchar(11) NOT NULL,
PRIMARY KEY (MaSV)
);
-
Câu lệnh này tạo bảng "HSSV" và chỉ định trường "MaSV" làm khóa chính.
-
Trong trường hợp khóa chính được thành lập từ nhiều trường và chúng ta cần đặt tên cho ràng buộc khóa này, chúng ta có thể sử dụng câu lệnh
CREATE TABLE
như sau:
CREATE TABLE HSSV (
MaSV varchar(8) NOT NULL,
Holot varchar(20),
Ten varchar(8),
NgaySinh DATE,
MaLop varchar(8) NOT NULL,
Lienhe varchar(11) NOT NULL,
CONSTRAINT Ma PRIMARY KEY (MaSV, MaLop)
);
- Trong trường hợp này, khóa chính của bảng được thành lập từ hai trường: "MaSV" và "MaLop", và tên ràng buộc là "Ma".
3.1 Tạo khóa chính cho bảng đã tạo
- Chúng ta có thể sử dụng câu lệnh sau:
ALTER TABLE HSSV ADD PRIMARY KEY (MaSV);
hoặc
ALTER TABLE HSSV ADD CONSTRAINT Ma PRIMARY KEY (MaSV, MaLop);
- Lưu ý rằng trường "MaSV" và "MaLop" phải đã được khai báo ràng buộc NOT NULL khi tạo bảng.
3.2 Xóa khóa chính
- Chúng ta có thể sử dụng câu lệnh sau:
ALTER TABLE HSSV DROP PRIMARY KEY;
hoặc
ALTER TABLE HSSV DROP CONSTRAINT Ma;
4. Thiết lập khóa ngoại
- Để tạo khóa ngoại khi tạo bảng, chúng ta có thể sử dụng câu lệnh SQL
CREATE TABLE
như sau:
CREATE TABLE DiemSV (
STT INT NOT NULL AUTO_INCREMENT,
MaSV varchar(8) NOT NULL,
MonHoc varchar(6) NOT NULL,
HKI,
HKII,
ĐTB_Nam INT,
PRIMARY KEY (STT),
FOREIGN KEY (MaSV) REFERENCES HSSV(MaSV)
);
-
Câu lệnh này tạo bảng "DiemSV" gồm 6 trường, trong đó khóa chính là trường "STT" và khóa ngoại là trường "MaSV". Bảng này tạo ràng buộc tham chiếu đến bảng "HSSV" thông qua trường "MaSV".
-
Một dạng khác của câu lệnh là:
CREATE TABLE DiemSV (
STT INT NOT NULL AUTO_INCREMENT,
MaSV varchar(8) NOT NULL,
MonHoc varchar(6) NOT NULL,
HKI,
HKII,
ĐTB_Nam INT,
PRIMARY KEY (STT),
CONSTRAINT Ma FOREIGN KEY (MaSV) REFERENCES HSSV(MaSV)
);
- Khi cần đặt tên cho ràng buộc khóa ngoại và khóa ngoại được hình thành từ nhiều trường, chúng ta phải sử dụng câu lệnh
CREATE TABLE
theo dạng này.
4.1 Tạo khóa ngoại cho bảng đã tạo
- Chúng ta có thể sử dụng câu lệnh sau:
ALTER TABLE DiemSV ADD FOREIGN KEY (MaSV) REFERENCES HSSV(MaSV);
hoặc
ALTER TABLE DiemSV ADD CONSTRAINT Ma FOREIGN KEY (MaSV) REFERENCES HSSV(MaSV);
- Câu lệnh này được sử dụng trong trường hợp cần đặt tên cho ràng buộc khóa ngoại và khóa ngoại được hình thành từ nhiều trường.
4.2 Xóa khóa ngoại
- Chúng ta có thể sử dụng câu lệnh sau:
ALTER TABLE DiemSV DROP FOREIGN KEY Ma;
- Câu lệnh
ALTER TABLE
trong MySQL thường được sử dụng để thay đổi tên bảng, tên trường hoặc thêm/xóa trường trong một bảng. Chúng ta sẽ quay lại câu lệnh này trong các bài viết sau.
5. Bảng so sánh
Khóa chính | Khóa ngoại |
---|---|
Xác định duy nhất một bản ghi trong bảng | Là một trường trong bảng và là khóa chính trong một bảng khác |
Không chấp nhận giá trị NULL | Có thể chấp nhận giá trị NULL |
Mặc định là một chỉ mục nhóm và dữ liệu trong bảng được tổ chức theo thứ tự của chỉ mục nhóm | Không tự động tạo chỉ mục, nhóm hoặc không nhóm. Cần tự tạo chỉ mục trên khóa ngoại |
Một bảng chỉ có thể có một khóa chính | Một bảng có thể có nhiều khóa ngoại |
6. Tổng kết
- Chúng ta đã tìm hiểu cách sử dụng các khóa chính và khóa ngoại trong MySQL. Chúng không chỉ được sử dụng trong MySQL mà còn trong SQL Server vì cả hai đều sử dụng ngôn ngữ T-SQL.
- Khi làm việc với các ứng dụng web, thường ít sử dụng khóa ngoại vì nó có thể làm chậm quá trình truy vấn. Vì vậy, chúng ta nên thiết kế cơ sở dữ liệu sao cho tối ưu và không cần sử dụng khóa ngoại.