Fullstack Vỡ Lòng 07: Các ràng buộc thường sử dụng trong MySQL - Constraints
Bài đăng này đã không được cập nhật trong 2 năm
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ịNULLnữa. - LƯU Ý: Các bạn cần phân biệt rõ giá trị
NULLvà 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 != NULLmà 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 taINSERTgiá 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
UNIQUEbao 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 KEYlà 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 KEYthì sẽ tự động được đánh dấu làNOT NULLvàUNIQUE. -
Thực hành với bảng
Employeetrong dbForge Studio for MySQL, các bạn sẽ thấy:-
Khi chúng ta set cột
IdlàPRIMARY KEY, thì cờNOT NULLvàUNIQUETỰ ĐỘ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 NULLvàUNIQUElên, nhưng cờPRIMARY KEYsẽ 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 KEYthìUNIQUEvàNOT NULLtự bật, không thể tắt đi. Còn ngược lại, bậtUNIQUEvàNOT NULLthìPRIMARY KEYsẽ 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 KEYcó thể bao gồm MỘT hoặc NHIỀU CỘT.
4. FOREIGN KEY
-
FOREIGN KEYlà 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
CompanyvàEmployeecó 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ÍNHIdbên bảngCompany.Nếu bạn cố tình
INSERTmộ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 KEYcó thể là MỘT hoặc NHIỀU CỘT của 1 bảng, được mapping vớiPRIMARY KEYcủa một bảng khác.- Bảng mà có chứa
FOREIGN KEYsẽ được gọi là bảng con (child table) - Còn bảng chứa
PRIMARY KEYmapping 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
DEFAULTdịch sang tiếng Việt nghĩa là "Mặc định"DEFAULTconstraint đượ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é:
All rights reserved