Bài trước: CSDL_Thực hành (4) - Tạo CSDL, bảng
-----
5. Tạo khóa ngoại, nhập liệu
5.1 Khóa chính và Khóa ngoại
Khóa (key) là gì?
Trong cơ sở dữ liệu quan hệ, "khóa" là một hoặc một tập hợp các thuộc tính (cột) trong một bảng (quan hệ), được sử dụng để xác định duy nhất một bản ghi (hàng) trong bảng đó hoặc để liên kết các bảng với nhau.
Khóa chính (primary key) là gì?
- Là khóa dùng để xác định duy nhất mỗi bản ghi trong một bảng.
- Mỗi bảng chỉ có một khóa chính.
- Giá trị của khóa chính không được trùng lặp và không được mang giá trị NULL.
- Ví dụ: Mã nhân viên (MANV) trong bảng Nhân viên.
Khóa ngoại (foreign key) là gì?
- Là khóa được sử dụng để liên kết hai bảng với nhau.
- Khóa ngoại của một bảng tham chiếu đến khóa chính của một bảng khác.
- Khóa ngoại giúp đảm bảo tính toàn vẹn tham chiếu giữa các bảng.
- Ví dụ: Mã chi nhánh (MSCN) trong bảng Nhân viên, tham chiếu đến Mã chi nhánh (MSCN) trong bảng Chi nhánh.
Thực hành tạo Khóa chính
Để tạo Khóa chính, có 2 cách: [1] tạo khóa chính khi tạo bảng (được sử dụng nhiều, bạn nên dùng cách này) và [2] tạo khóa chính sau khi tạo bảng.
Cú pháp: sử dụng từ khóa PRIMARY KEY trong lúc tạo bảng
CREATE TABLE tên_bảng
(tên_cột kiểu_dữ_liệu PRIMARY KEY,
... các cột khác
)
Ví dụ:
---Tạo bảng NhanVien
Create table NhanVien
(MaNV char(4)primary key,
…
các cột khác
)
Thực hành tạo Khóa ngoại
Để tạo Khóa ngoại, có 2 cách: [1] tạo khóa ngoại khi tạo bảng (được sử dụng nhiều, bạn nên dùng cách này) và [2] tạo khóa ngoại sau khi tạo bảng.
Cú pháp tạo khóa ngoại khi tạo bảng:
CREATE TABLE tên_bảng
(tên_cột kiểu_dữ_liệu,
... các cột khác
Tên_cột kiểu_dữ_liệu REFERENCES
tên_bảng_tham_chiếu(tên_cột_tham_chiếu)
)
Ví dụ:
---Tạo bảng NhanVien
Create table NhanVien
(MaNV char(4) primary key,
…
MSCN char(2) references
ChiNhanh(MSCN) --khai báo khóa ngoại
)
Cú pháp tạo Khóa ngoại sau khi tạo bảng:
- Bạn sử dụng cách này, khi muốn thêm khóa ngoại vào một bảng đã tồn tại.
Cú pháp:
ALTER TABLE tên_bảng ADD CONSTRAINT
tên_ràng_buộc FOREIGN KEY (tên_cột) REFERENCES tên_bảng_tham_chiếu(tên_cột_tham_chiếu)
Ví dụ:
Trong CSDL Lab01_QLNV, chúng ta đã tạo xong các bảng. Do vậy, chúng ta sẽ sử dụng cú pháp này để tạo các Khóa ngoại cho các bảng.
Trong bảng NhanVien, tạo khóa ngoại cho cột MSCN tham chiếu tới cột MSCN của bảng ChiNhanh.
Trong cửa sổ SQLQuery, viết và chạy lệnh SQL sau (viết vào cuối tập tin):
---Tạo khóa ngoại cho bảng NhanVien tham chiếu tới ChiNhanh
alter table NhanVien add constraint
FK_NhanVien_ChiNhanh foreign key
(MSCN) references ChiNhanh(MSCN)
Xem Khóa chính và khóa ngoại của bảng:
- Trong giao diện SSMS, cửa sổ Object Explorer > chọn CSDL (ví dụ Lab01_QLNV)
- Mở rộng mục Tables > chọn một bảng cụ thể (ví dụ NhanVien)
- Mở rộng bảng NhanVien > mở rộng mục Keys để xem khóa chính và khóa ngoại của bảng. Khóa chính sẽ bắt đầu bằng tiền tố PK_. PK là viết tắt của primary key. Tương tự, khóa ngoại là FK_. FK là viết tắt của foreign key.
Trong bảng NhanVienKyNang, tạo 2 khóa ngoại cho cột MANV và MSKN
---Tạo 2 khóa ngoại cho bảng NhanVienKyNang
alter table NhanVienKyNang
add constraint FK_NhanVienKyNang_NhanVien foreign key (MANV) references NhanVien(MANV)
alter table NhanVienKyNang
add constraint FK_NhanVienKyNang_KyNang foreign key (MSKN) references KyNang(MSKN)
Vậy là chúng ta đã tạo xong các bảng, đã thiết lập các ràng buộc dữ liệu của các cột, thiết lập khóa chính, khóa ngoại. Nghĩa là đã định nghĩa xong Mô hình dữ liệu theo kiểu quan hệ.
Công việc tiếp theo là nhập dữ liệu vào các bảng.
5.2 Nhập dữ liệu vào bảng
Một số bảng dữ liệu mẫu:
Bảng ChiNhanh
Bảng KyNang
Bảng NhanVienKyNang
Bảng NhanVien
Để nhập dữ liệu cho bảng bạn có thể sử dụng [1] giao diện đồ họa của SSMS hoặc [2] lệnh SQL.
- [1] Nhập liệu bằng SSMS: chuột phải vào tên bảng > chọn Edit Top 200 Rows > thực hiện nhập liệu
- [2] Nhập liệu bằng lệnh SQL
Khi nhập liệu, bạn cần để ý ràng buộc về khóa ngoại. Bạn chỉ có thể nhập giá trị cho cột khóa ngoại khi giá trị đó đã tồn tại trong cột khóa chính (của bảng chính). Ví dụ: trong bảng NhanVien, bạn không thể nhập giá trị cho cột MSCN là “01” nếu trong bảng ChiNhanh chưa có giá trị “01” ở cột MSCN. Do vậy, thứ tự chèn dữ liệu cho các bảng là quan trọng.
Trong cửa sổ SQLQuery, nhập và chạy các lệnh sau:
----------------NHẬP DỮ LIỆU CHO CÁC BẢNG-------
--Nhập bảng ChiNhanh
insert into ChiNhanh values('01', N'Quận 1')
insert into ChiNhanh values('02', N'Quận 5')
insert into ChiNhanh values('03', N'Bình Thạnh')
Kiểm tra dữ liệu nhập vào bảng:
- Có thể chuột phải vào bảng > chọn Edit Top 200 Rows hoặc Select Top 1000 Rows
- Hoặc dùng lệnh SQL
-- Xem dữ liệu bảng ChiNhanh
select * from ChiNhanh
Nhập dữ liệu cho bảng NhanVien
--Nhập bảng NhanVien
Set Dateformat dmy --khai báo với SQL nhập ngày tháng theo dạng ngày/tháng/năm
Go
--ký hiệu N đứng trước chuỗi ký tự (ví dụ: N'Lê Văn', N'Minh')
được sử dụng để chỉ định rằng chuỗi đó là chuỗi Unicode.
insert into NhanVien values('0001',N'Lê Văn',
N'Minh','10/06/1960','02/05/1986','01')
insert into NhanVien values('0002',N'Nguyễn
Thị',N'Mai','20/04/1970','04/07/2001','01')
insert into NhanVien values('0003',N'Lê Anh',N'Tuấn','25/06/1975','01/09/1982','02')
insert into NhanVien values('0004',N'Vương
Tuấn',N'Vũ','25/03/1975','12/01/1986','02')
insert into NhanVien values('0005',N'Lý
Anh',N'Hân','01/12/1980','15/05/2004','02')
insert into NhanVien values('0006',N'Phan
Lê',N'Tuấn','04/06/1976','25/10/2002','03')
insert into NhanVien values('0007',N'Lê
Tuấn',N'Tú','15/08/1975','15/08/2000','03')
--Xem bảng NhanVien
Select * from NhanVien
Nhập dữ liệu cho bảng KyNang
--Nhập bảng KyNang
insert into KyNang values('01',N'Word')
insert into KyNang values('02',N'Excel')
insert into KyNang values('03',N'Access')
insert into KyNang values('04',N'Power Point')
insert into KyNang values('05',N'SPSS')
--Xem bảng KyNang
Select * from KyNang
Nhập dữ liệu cho bảng NhanVienKyNang
--Nhập bảng nhanvienkynang
insert into NhanVienKyNang values('0001','01',2)
insert into NhanVienKyNang values('0001','02',1)
insert into NhanVienKyNang values('0002','01',2)
insert into NhanVienKyNang values('0002','03',2)
insert into NhanVienKyNang values('0003','02',1)
insert into NhanVienKyNang values('0003','03',2)
insert into NhanVienKyNang values('0004','01',5)
insert into NhanVienKyNang values('0004','02',4)
insert into NhanVienKyNang values('0004','03',1)
insert into NhanVienKyNang values('0004','04',3)
insert into NhanVienKyNang values('0004','05',4)
insert into NhanVienKyNang values('0005','02',4)
insert into NhanVienKyNang values('0005','04',4)
insert into NhanVienKyNang values('0006','05',4)
insert into NhanVienKyNang values('0006','02',4)
insert into NhanVienKyNang values('0006','03',2)
insert into NhanVienKyNang values('0007','03',4)
insert into NhanVienKyNang values('0007','04',3)
--Xem bảng NhanVienKyNang
Select * from NhanVienKyNang
Vậy là chúng ta đã nhập xong dữ liệu cho CSDL.
Bạn nên lưu lại nội dung tập tin SQLQuery (ví dụ đặt tên là Lab01_QLNV.sql), để khi phải chuyển sang một máy tính khác (hoặc cần tạo lại CSDL), bạn chỉ cần chạy lại tập tin SQLQuery là sẽ có CSDL, kèm theo dữ liệu, để có thể thực hiện các câu truy vấn trên dữ liệu.
5.3 Bài tập
Câu 5.1 Khóa chính (primary key) là gì? Phát biểu nào sau đây không đúng?
A. Khóa chính dùng để xác định duy nhất mỗi bản ghi trong một bảng.
B. Giá trị của khóa chính có thể trùng lặp.
C. Mỗi bảng chỉ có một khóa chính.
D. Giá trị của khóa chính không được mang giá trị NULL.
Câu 5.2 Khóa ngoại (foreign key) là gì? Phát biểu nào sau đây không đúng?
A. Khóa ngoại được sử dụng để liên kết hai bảng với nhau.
B. Khóa ngoại của một bảng tham chiếu đến khóa chính của một bảng khác.
C. Khóa ngoại giúp đảm bảo tính toàn vẹn tham chiếu giữa các bảng.
D. Khóa ngoại dùng để xác định duy nhất mỗi bản ghi trong một bảng.
Bài 5.3. Tạo khóa ngoại và nhập dữ liệu cho các bảng trong CSDL Lab01_QLNV.
-----
Cập nhật: 18/3/2025
-----
Bài sau: CSDL_Thực hành (6) - Truy vấn dữ liệu