Ràng buộc CHECK trong MySQL

Ràng buộc CHECK trong MySQL
Ràng buộc CHECK trong MySQL

Chức năng của Ràng buộc CHECK trong MySQL

Ràng buộc CHECK trong MySQL dùng để ràng buộc các giá trị nhập vào của các cột nhưng chấp nhận giá trị NULL.

Ràng buộc CHECK khi tạo bảng trong MySQL

Ràng buộc CHECK một cột khi tạo bảng trong MySQL

CREATE TABLE `tb_bangnhanvien` (
  `id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
  `ten` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL,
  `luong` int(11),
  `tuoi` int(11),
  CONSTRAINT CHE_tuoi CHECK (tuoi>17),
  CONSTRAINT CHE_luong CHECK (luong>5000000)
  ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
<?php
   $dbhost = 'localhost';
   $dbuser = 'webmoi_userdata'; // Tên username
   $dbpass = 'IhNRcn9n'; // Mật khẩu
   // Kết nối đến tên username
   $conn = mysql_connect($dbhost, $dbuser, $dbpass);
   if(! $conn ){
     die('Không kết nối được: ' . mysql_error());
   }
   // Chọn tên database
   mysql_select_db('webmoi_tendata');
   // Xét kiểu tiếng việt 
   mysql_query('SET NAMES "utf8"');
   
  // CREATE TABLE `tb_bangnhanvien`
   echo "<b>CREATE TABLE `tb_bangnhanvien`</b><br>";
   $sql ="CREATE TABLE `tb_bangnhanvien` (
  `id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
  `ten` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL,
  `luong` int(11),
  `tuoi` int(11),
  CONSTRAINT CHE_tuoi CHECK (tuoi>17),
  CONSTRAINT CHE_luong CHECK (luong>5000000)
  ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
  ";
  //Cột id: kiểu int giới hạn 11 ký tự, không cho phép null, PRIMARY KEY là tạo khóa chính, AUTO_INCREMENT là tự động tăng dần sau mỗi lần thêm một hàng
  // Cột ten: kiểu chữ varchar giới hạn 255 ký tự, kiểu utf-8, cho phép null
   $ketquamot = mysql_query($sql,$conn);
   if(!$ketquamot){
	  die('Không thể tạo bảng: ' . mysql_error());  
   }else{
	  echo "Tạo tb_bangnhanvien thành công!"; 
   } 
   // Đóng kết nối database
   mysql_close($conn);
?>

Kết quả:

CREATE TABLE `tb_bangnhanvien`
Tạo tb_bangnhanvien thành công!

Ràng buộc CHECK nhiều cột khi tạo bảng trong MySQL

CREATE TABLE `tb_bangnhanvien` (
  `id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
  `ten` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL,
  `luong` int(11),
  `tuoi` int(11),
  CONSTRAINT CHE_tuoi_luong CHECK (tuoi>17 AND luong>5000000)
  ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
<?php
   $dbhost = 'localhost';
   $dbuser = 'webmoi_userdata'; // Tên username
   $dbpass = 'IhNRcn9n'; // Mật khẩu
   // Kết nối đến tên username
   $conn = mysql_connect($dbhost, $dbuser, $dbpass);
   if(! $conn ){
     die('Không kết nối được: ' . mysql_error());
   }
   // Chọn tên database
   mysql_select_db('webmoi_tendata');
   // Xét kiểu tiếng việt 
   mysql_query('SET NAMES "utf8"');
   
  // CREATE TABLE `tb_bangnhanvien`
   echo "<b>CREATE TABLE `tb_bangnhanvien`</b><br>";
   $sql ="CREATE TABLE `tb_bangnhanvien` (
  `id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
  `ten` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL,
  `luong` int(11),
  `tuoi` int(11),
  CONSTRAINT CHE_tuoi_luong CHECK (tuoi>17 AND luong>5000000)
  ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
  ";
  //Cột id: kiểu int giới hạn 11 ký tự, không cho phép null, PRIMARY KEY là tạo khóa chính, AUTO_INCREMENT là tự động tăng dần sau mỗi lần thêm một hàng
  // Cột ten: kiểu chữ varchar giới hạn 255 ký tự, kiểu utf-8, cho phép null
   $ketquamot = mysql_query($sql,$conn);
   if(!$ketquamot){
	  die('Không thể tạo bảng: ' . mysql_error());  
   }else{
	  echo "Tạo tb_bangnhanvien thành công!"; 
   } 
   // Đóng kết nối database
   mysql_close($conn);
?>

Kết quả:

CREATE TABLE `tb_bangnhanvien`
Tạo tb_bangnhanvien thành công!

ALTER TABLE Ràng buộc CHECK sau khi tạo bảng trong MySQL

ALTER TABLE Ràng buộc CHECK một cột sau khi tạo bảng trong MySQL

ALTER TABLE tb_bangnhanvien ADD CONSTRAINT CHK_tuoi CHECK (tuoi>=18);
<?php
   $dbhost = 'localhost';
   $dbuser = 'webmoi_userdata'; // Tên username
   $dbpass = 'IhNRcn9n'; // Mật khẩu
   // Kết nối đến tên username
   $conn = mysql_connect($dbhost, $dbuser, $dbpass);
   if(! $conn ){
     die('Không kết nối được: ' . mysql_error());
   }
   // Chọn tên database
   mysql_select_db('webmoi_tendata');
   // Xét kiểu tiếng việt 
   mysql_query('SET NAMES "utf8"');
   
  // ALTER TABLE `tb_bangnhanvien`
   echo "<b>ALTER TABLE `tb_bangnhanvien`</b><br>";
   $sql ="ALTER TABLE tb_bangnhanvien
   ADD CONSTRAINT CHK_tuoi CHECK (tuoi>=18)";
   $ketquamot = mysql_query($sql,$conn);
   if(!$ketquamot){
	  die('Không thể ALTER TABLE: ' . mysql_error());  
   }else{
	  echo "ALTER TABLE tb_bangnhanvien thành công!"; 
   } 
   // Đóng kết nối database
   mysql_close($conn);
?>

Kết quả:

ALTER TABLE `tb_bangnhanvien`
ALTER TABLE tb_bangnhanvien thành công!

ALTER TABLE Ràng buộc CHECK nhiều cột sau khi tạo bảng trong MySQL

ALTER TABLE tb_bangnhanvien ADD CONSTRAINT CHK_tuoi_luong CHECK (tuoi>=18 AND luong >5000000);
<?php
   $dbhost = 'localhost';
   $dbuser = 'webmoi_userdata'; // Tên username
   $dbpass = 'IhNRcn9n'; // Mật khẩu
   // Kết nối đến tên username
   $conn = mysql_connect($dbhost, $dbuser, $dbpass);
   if(! $conn ){
     die('Không kết nối được: ' . mysql_error());
   }
   // Chọn tên database
   mysql_select_db('webmoi_tendata');
   // Xét kiểu tiếng việt 
   mysql_query('SET NAMES "utf8"');
   
  // ALTER TABLE `tb_bangnhanvien`
   echo "<b>ALTER TABLE `tb_bangnhanvien`</b><br>";
   $sql ="ALTER TABLE tb_bangnhanvien
   ADD CONSTRAINT CHK_tuoi_luong CHECK (tuoi>=18 AND luong >5000000)";
   $ketquamot = mysql_query($sql,$conn);
   if(!$ketquamot){
	  die('Không thể ALTER TABLE: ' . mysql_error());  
   }else{
	  echo "ALTER TABLE tb_bangnhanvien thành công!"; 
   } 
   // Đóng kết nối database
   mysql_close($conn);
?>

Kết quả:

ALTER TABLE `tb_bangnhanvien`
ALTER TABLE tb_bangnhanvien thành công!

Xóa tên ràng buộc CHECK trong MySQL

ALTER TABLE tb_bangnhanvien DROP CONSTRAINT CHK_tuoi;
<?php
   $dbhost = 'localhost';
   $dbuser = 'webmoi_userdata'; // Tên username
   $dbpass = 'IhNRcn9n'; // Mật khẩu
   // Kết nối đến tên username
   $conn = mysql_connect($dbhost, $dbuser, $dbpass);
   if(! $conn ){
     die('Không kết nối được: ' . mysql_error());
   }
   // Chọn tên database
   mysql_select_db('webmoi_tendata');
   // Xét kiểu tiếng việt 
   mysql_query('SET NAMES "utf8"');
   
  // ALTER TABLE `tb_bangnhanvien`
   echo "<b>ALTER TABLE `tb_bangnhanvien`</b><br>";
   $sql ="ALTER TABLE tb_bangnhanvien
          DROP CONSTRAINT CHK_tuoi";
   $ketquamot = mysql_query($sql,$conn);
   if(!$ketquamot){
	  die('Không thể ALTER TABLE: ' . mysql_error());  
   }else{
	  echo "ALTER TABLE tb_bangnhanvien thành công!"; 
   } 
   // Đóng kết nối database
   mysql_close($conn);
?>

Kết quả:

ALTER TABLE `tb_bangnhanvien`
ALTER TABLE tb_bangnhanvien thành công!

Kiểm tra và xử lý dữ liệu với ràng buộc CHECK trong MySQL

Ràng buộc CHECK giúp MySQL kiểm soát dữ liệu ngay tại thời điểm thêm mới hoặc cập nhật. Tuy nhiên, để sử dụng hiệu quả, cần kiểm tra điều kiện đã khai báo có phù hợp với dữ liệu thực tế hay không và biết cách xử lý khi dữ liệu không đáp ứng yêu cầu.

Kiểm tra điều kiện CHECK có hoạt động đúng không

Cách đơn giản để kiểm tra là thử thêm hoặc cập nhật một bản ghi có giá trị thỏa mãn điều kiện và một bản ghi cố tình vi phạm điều kiện. Nếu điều kiện được thiết lập đúng, dữ liệu hợp lệ sẽ được chấp nhận, còn dữ liệu không hợp lệ sẽ bị từ chối.

CREATE TABLE san_pham (
    id INT PRIMARY KEY,
    ten_san_pham VARCHAR(100),
    gia DECIMAL(10,2),
    CONSTRAINT chk_gia CHECK (gia > 0)
);

INSERT INTO san_pham (id, ten_san_pham, gia)
VALUES (1, 'Sản phẩm A', 150000);

Trong ví dụ trên, giá sản phẩm phải lớn hơn 0. Có thể tiếp tục thử một giá trị bằng 0 hoặc nhỏ hơn 0 để xác nhận MySQL đang thực thi đúng điều kiện đã đặt ra.

Xử lý dữ liệu không đáp ứng điều kiện CHECK

Khi thêm hoặc cập nhật dữ liệu vi phạm điều kiện CHECK, MySQL sẽ từ chối thao tác thay vì đưa dữ liệu không hợp lệ vào bảng. Vì vậy, ứng dụng nên kiểm tra và thông báo rõ nguyên nhân để người dùng có thể sửa dữ liệu.

INSERT INTO san_pham (id, ten_san_pham, gia)
VALUES (2, 'Sản phẩm B', -50000);

Với điều kiện gia > 0, giá trị âm không đáp ứng yêu cầu nên bản ghi không được thêm vào. Cách xử lý phù hợp là cung cấp giá trị hợp lệ hoặc điều chỉnh dữ liệu trước khi thực hiện lại thao tác.

Những lưu ý khi sử dụng nhiều ràng buộc CHECK

Một bảng có thể sử dụng nhiều điều kiện CHECK để kiểm soát các cột khác nhau hoặc kết hợp nhiều quy tắc dữ liệu. Các điều kiện nên được xây dựng rõ ràng, tránh chồng chéo khiến việc kiểm tra và bảo trì trở nên khó khăn.

CREATE TABLE nhan_vien (
    id INT PRIMARY KEY,
    tuoi INT,
    luong DECIMAL(12,2),
    CONSTRAINT chk_tuoi CHECK (tuoi >= 18),
    CONSTRAINT chk_luong CHECK (luong > 0)
);

Trong trường hợp này, dữ liệu phải đồng thời đáp ứng cả hai điều kiện: tuổi từ 18 trở lên và lương lớn hơn 0. Khi thiết kế nhiều CHECK, nên đặt tên ràng buộc dễ nhận biết để thuận tiện cho việc kiểm tra, sửa đổi và quản lý cấu trúc bảng về sau.

Lời kết

Cảm ơn các bạn đã tham khảo bài viết Ràng buộc CHECK trong MySQL.

Tải file database .sql về nếu muốn kiểm tra hoặc thực hành Tải về.

  • 0 Bình luận
CEO Bùi Tấn Lực | Founder Web Mới
Bùi Tấn Lực
Tìm hiểu về CEO Bùi Tấn Lực, Founder Web Mới với nhiều năm kinh nghiệm trong lĩnh vực phát triển website, SEO và chia sẻ kiến thức công nghệ
Đánh giá
Chia sẻ nội dung đánh giá của bạn về Ràng buộc CHECK trong MySQL
Email, Điện thoại của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *
Đánh giá của bạn
Tên *
Email
Số điện thoại *
Bình luận, Hỏi đáp
Yêu Cầu Báo Giá
Gửi trang web mẫu cần làm theo, chúng tôi sẽ báo giá đến bạn từ Email (tanlucit09@gmail.com - Bùi Tấn Lực) hoặc Zalo (Lực IT - 0398259259) !