+3

Fullstack Vỡ Lòng 07: Các ràng buộc thường sử dụng trong MySQL - Constraints

Mayfest2023

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ạighi nhớ ngay nha.

fullstack 00.png

Đặ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)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 constraintNOT 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ị NULLgiá 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ừ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ệnvalue != NULL mà thôi.
  • 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ộtNOT NULL, thì nếu ta INSERT 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 KEYKHÓ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 NULLUNIQUE.

  • 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 IdPRIMARY KEY, thì cờ NOT NULLUNIQUE 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 NULLUNIQUE 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ật PRIMARY KEY thì UNIQUENOT NULL tự bật, không thể tắt đi. Còn ngược lại, bật UNIQUENOT 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 KEYKHÓ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 CompanyEmployeequan hệ "1 - nhiều" (1 Công ty có thể có nhiều Nhân viên)

      Bảng Company:

      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);
      );
      

      image.png

      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);
      );
      

      image.png

      Trong bảng Employee, ta có KHÓA NGOẠI CompanyId, mapping với KHÓA CHÍNH Id bên bảng Company.

      Nếu bạn cố tình INSERT một Nhân viên thuộc Công ty MISA với CompanyId = 10 (KHÔNG NẰM TRONG bảng Company)

      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ới PRIMARY 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ới FOREIGN KEY ở trên, thì được gọi là bảng cha (referenced table hoặc parent table)

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é:

Facebook: Tờ Mờ Sáng học Lập trình

Youtube: Tờ Mờ Sáng học Lập trình


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí