Nếu nhắc đến PRIMARY KEY
, FOREIGN KEY
, NOT NULL
, chắc hẳn nhiều bạn đều đã nghe đến và quen thuộc rồi.
Nhưng thuật ngữ gọi những từ khóa trên là Constraint (hay Ràng buộc) thì nhiều bạn lại cảm thấy bỡ ngỡ.
Trong quá trình làm việc, khi thiết kế Database, anh em trong dự án thường trao đổi với nhau xem "bảng này cần thiết lập những Constaint nào".
Vì vậy, nếu bạn còn lạ lẫm với thuật ngữ chuyên môn này, thì hãy note lại và ghi nhớ ngay nha.
Đặc điểm của Constraint
- Constraint được sử dụng để chỉ rõ những quy tắc (rules) cho dữ liệu trong một bảng.
- Điều này đảm bảo tính Chính xác (Accuracy) và tính Tin cậy (Reliability) của dữ liệu trong bảng đó.
- Nếu có bất kỳ hành động nào (ví dụ INSERT, UPDATE, DELETE) làm vi phạm các Constraint đã thiết lập, thì MySQL sẽ trả về lỗi.
Những Constraint thường sử dụng
1. NOT NULL
- Trong MySQL, mặc định khi tạo mới 1 cột trong bảng, cột đó sẽ có thể có giá trị
NULL
. - Khi ta set cột đó với constraint là
NOT NULL
, thì sẽ khiến cột đó KHÔNG THỂ CÓ giá trịNULL
nữa. - LƯU Ý: Các bạn cần phân biệt rõ giá trị
NULL
và giá trị rỗng (''
) nha- Đây là 2 giá trị HOÀN TOÀN KHÁC NHAU.
- Nhiều bạn cứ hay gom 2 khái niệm này lại thành một, khiến cho quá trình làm việc và trao đổi dễ bị hiểu nhầm ý nhau.
- Ví dụ: Từ giờ trở đi, chúng ta thống nhất với nhau rằng, nếu mình nói là "Cột này không được để trống", thì các bạn hiểu là Giá trị của cột này phải vừa khác giá trị rỗng (
value != ''
) và vừa khác giá trị NULL (value != NULL
) - Còn nếu mình chỉ nói là "Cột này không được phép NULL", thì sẽ chỉ còn lại một điều kiện là
value != NULL
mà thôi.
- Ví dụ: Từ giờ trở đi, chúng ta thống nhất với nhau rằng, nếu mình nói là "Cột này không được để trống", thì các bạn hiểu là Giá trị của cột này phải vừa khác giá trị rỗng (
- Chỉ khi các bạn hiểu đúng được LƯU Ý trên, thì các bạn mới nhớ được rằng, nếu ta set 1 cột là
NOT NULL
, thì nếu taINSERT
giá trị rỗng (''
) vào cột đó, MySQL vẫn sẽ không báo lỗi gì cả. - Ví dụ:
CREATE TABLE Employee ( Id int NOT NULL, Code varchar(20) NOT NULL, <======= LastName varchar(100) NOT NULL, FirstName varchar(100) NOT NULL, DateOfBirth date );
2. UNIQUE
- Khi ta set 1 cột có constraint là
UNIQUE
, thì tất cả các giá trị nằm trong cột đó sẽ KHÔNG ĐƯỢC TRÙNG NHAU. - Ví dụ:
CREATE TABLE Employee ( Id int NOT NULL, Code varchar(20) NOT NULL, LastName varchar(100) NOT NULL, FirstName varchar(100) NOT NULL, DateOfBirth date, UNIQUE (Code) <======= );
- Chúng ta cũng có thể set MỘT
UNIQUE
bao gồm NHIỀU CỘT.CREATE TABLE Employee ( Id int NOT NULL, Code varchar(20) NOT NULL, LastName varchar(100) NOT NULL, FirstName varchar(100) NOT NULL, DateOfBirth date, CompanyId int NOT NULL, PRIMARY KEY (Id), CONSTRAINT UX_Employee UNIQUE (Code, CompanyId) <======= );
3. PRIMARY KEY
-
Chắc hẳn các bạn đã quá quen thuộc với constraint này rồi.
-
PRIMARY KEY
là KHÓA CHÍNH trong bảng, giúp định danh các bản ghi (record/row) trong bảng đó. -
Một cột được set là
PRIMARY KEY
thì sẽ tự động được đánh dấu làNOT NULL
vàUNIQUE
. -
Thực hành với bảng
Employee
trong dbForge Studio for MySQL, các bạn sẽ thấy:-
Khi chúng ta set cột
Id
làPRIMARY KEY
, thì cờNOT NULL
vàUNIQUE
TỰ ĐỘNG ĐƯỢC BẬT LÊN và bị disabled không cho phép các bạn chỉnh sửa. -
Còn đối với cột
Code
, mình bật thủ công 2 cờNOT NULL
vàUNIQUE
lên, nhưng cờPRIMARY KEY
sẽ KHÔNG TỰ ĐỘNG BẬT LÊN. Các bạn phải NHỚ RÕ SỰ KHÁC NHAU này nha: "BậtPRIMARY KEY
thìUNIQUE
vàNOT NULL
tự bật, không thể tắt đi. Còn ngược lại, bậtUNIQUE
vàNOT NULL
thìPRIMARY KEY
sẽ KHÔNG TỰ BẬT đâu"
-
-
Ngoài ra, còn một lưu ý nữa là: 1 bảng sẽ chỉ có thể có DUY NHẤT 1
PRIMARY KEY
, vàPRIMARY KEY
có thể bao gồm MỘT hoặc NHIỀU CỘT.
4. FOREIGN KEY
-
FOREIGN KEY
là KHÓA NGOẠI, giúp ngăn chặn những hành động có thể phá hủy liên kết giữa các bảng với nhau.-
Ví dụ: Ta có 2 bảng
Company
vàEmployee
có quan hệ "1 - nhiều" (1 Công ty có thể có nhiều Nhân viên)
BảngCompany
:CREATE TABLE Company ( Id int NOT NULL, <======= Code varchar(20) NOT NULL, Name varchar(255) NOT NULL, PRIMARY KEY (Id), CONSTRAINT UX_Company UNIQUE (Code); );
Bảng
Employee
:CREATE TABLE Employee ( Id int NOT NULL, Code varchar(20) NOT NULL, LastName varchar(100) NOT NULL, FirstName varchar(100) NOT NULL, DateOfBirth date, CompanyId int NOT NULL, PRIMARY KEY (Id), CONSTRAINT FK_Employee_Company FOREIGN KEY (CompanyId) REFERENCES Company (Id), <======= CONSTRAINT UX_Employee UNIQUE (Code, CompanyId); );
Trong bảng
Employee
, ta có KHÓA NGOẠICompanyId
, mapping với KHÓA CHÍNHId
bên bảngCompany
.Nếu bạn cố tình
INSERT
một Nhân viên thuộc Công ty MISA vớiCompanyId
=10
(KHÔNG NẰM TRONG bảngCompany
)INSERT INTO employee (Id, Code, LastName, FirstName, DateOfBirth, CompanyId) VALUES (6, 'NV0006', 'Bùi Văn', 'Minh', '1999-09-13', 10);
thì MySQL sẽ trả về lỗi như sau:
Cannot add or update a child row: a foreign key constraint fails (`test`.`employee`, CONSTRAINT `FK_employee_CompanyId` FOREIGN KEY (`CompanyId`) REFERENCES `company` (`Id`))
-
-
Một
FOREIGN KEY
có thể là MỘT hoặc NHIỀU CỘT của 1 bảng, được mapping vớiPRIMARY KEY
của một bảng khác.- Bảng mà có chứa
FOREIGN KEY
sẽ được gọi là bảng con (child table) - Còn bảng chứa
PRIMARY KEY
mapping vớiFOREIGN KEY
ở trên, thì được gọi là bảng cha (referenced table hoặc parent table)
- Bảng mà có chứa
5. DEFAULT
DEFAULT
dịch sang tiếng Việt nghĩa là "Mặc định"DEFAULT
constraint được sử dụng để set giá trị mặc định cho một cột trong bảng, khi giá trị của cột đó không được chỉ rõ lúc ta thêm mới một bản ghi vào trong bảng.- Ví dụ: Ngày ghi Hóa đơn mặc định là ngày hôm nay
CREATE TABLE Order ( Id int NOT NULL, Code varchar(20) NOT NULL, OrderDate date DEFAULT CURRENT_DATE(), <======= PRIMARY KEY (Id), );
Kết bài
Trên đây là nội dung về Các ràng buộc trong MySQL - Constraints.
Các bạn có thể đọc thêm các bài viết trước trong series "Fullstack Vỡ Lòng" của mình tại đây: https://viblo.asia/s/fullstack-vo-long-5OXLA0AvJGr
Ở bài viết tiếp theo, mình sẽ chia sẻ với các bạn về Index, Ưu nhược điểm của nó và lý do Tại sao lại có những Ưu nhược điểm như vậy.
Mời các bạn cùng đón xem!
Ngoài ra, các bạn cũng có thể follow page Facebook và channel Youtube này để cập nhật những thông tin thú vị về Lập trình nhé: