- vừa được xem lúc

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

0 0 24

Người đăng: Tờ Mờ Sáng học Lập trình

Theo Viblo Asia

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

Bình luận

Bài viết tương tự

- vừa được xem lúc

Index trong Mysql và cách sử dụng

Một số database là một cấu trúc dữ liệu để cải thiện tốc độ của các hoạt động trong một bảng. Trong khi tạo index, nó cần được xem xét rằng các cột đó sẽ được sử dụng để thực hiện các truy vấn SQL và tạo ra một hoặc nhiều chỉ số trên các cột đó là gì.

0 0 43

- vừa được xem lúc

Tạo ER Diagram của một Database bằng MySQL Workbench

Trong số chúng ta ai cũng đều đã từng trải qua một thời sinh viên tràn ngập đồ án này, đồ án kia đúng không? Mình cũng đã từng có một thời như thế Mà chuyên ngành chúng ta là công nghệ thông tin thì làm việc với Database trong mỗi đồ án là điều không thể thiếu rồi. Chuyện sẽ chẳng có gì to tát cho đ

0 0 65

- vừa được xem lúc

Window Functions trong MySQL, Nâng cao và cực kì hữu dụng (Phần II).

Chào mọi người, lại là mình đây, ở phần trước mình đã giới thiệu với mọi người về Window Functions Phần I. Nếu chưa rõ nó là gì thì mọi người nên đọc lại trước nha, để nắm được định nghĩa và các key words, tránh mắt chữ O mồm chứ A vì phần này mình chủ yếu sẽ thực hành với các Window Functions.

0 0 107

- vừa được xem lúc

Window Functions trong MySQL, Nâng cao và cực kì hữu dụng (Phần I).

Chào mọi người, mình mới tìm hiểu đc topic Window Functions cá nhân mình cảm thấy khá là hay và mình đánh giá nó là phần nâng cao. Vì ít người biết nên Window Functions thấy rất ít khi sử dụng, thay vì đó là những câu subquery dài dằng dặc như tin nhắn nhắn cho crush, và người khác đọc hiểu được câu

0 0 923

- vừa được xem lúc

Mysql index strategy

Trong Mysql, index hỗ trợ việc tìm kiếm các rows theo từng giá trị của các columns trong bảng trở nên nhanh chóng. Việc tìm kiếm sẽ phải scan toàn bộ table nếu các column trong câu query không được đánh index một cách thích hợp. . .

0 0 65

- vừa được xem lúc

CRUD Nodejs với mysql

Mở Đầu. Xin chào các bạn tiếp tục với series Nodejs cơ bản, bài hôm nay mình sẽ tiếp tục làm thêm các chức năng xem chi tiết và sửa và xóa sản phẩm.

0 0 77