Chỉ mục UNIQUE trong MySQL

Chỉ mục UNIQUE trong MySQL
Chỉ mục UNIQUE trong MySQL

Chức năng của Chỉ mục UNIQUE trong MySQL

Chỉ mục UNIQUE trong MySQL dùng để ràng buộc giá trị truyền vào không cho phép trùng với giá trị cột trong bảng nhưng giá trị NULL thì được, bạn có thể tạo nhiều tên chỉ mục, mỗi tên chỉ mục có thể là một cột hoặc nhiều cột.

Chỉ mục UNIQUE khi tạo bảng trong MySQL

Chỉ mục UNIQUE một cột khi tạo bảng trong MySQL

Giá trị của cột cccd mới thêm vào không được trùng với giá trị có trong bảng, NULL thì được:

CREATE TABLE `tb_congdan` (
  `id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
  `ten` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL,
  `cccd` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci UNIQUE
  ) 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_congdan`
   echo "<b>CREATE TABLE `tb_congdan`</b><br>";
   $sql ="CREATE TABLE `tb_congdan` (
  `id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
  `ten` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL,
  `cccd` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci UNIQUE
  ) 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_congdan thành công!"; 
   } 
   // Đóng kết nối database
   mysql_close($conn);
?>

Kết quả:

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

Chỉ mục UNIQUE nhiều cột khi tạo bảng trong MySQL

Giá trị của cột cccd và cột email mới thêm vào không được cùng nhau trùng với giá trị có trong bảng, nếu một trong 2 cột trùng thì được, hoặc NULL thì được:

CREATE TABLE `tb_congdan` (
  `id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
  `ten` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL,
  `cccd` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci,
  `email` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci,
  UNIQUE (cccd, email) 
  ) 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_congdan`
   echo "<b>CREATE TABLE `tb_congdan`</b><br>";
   $sql ="CREATE TABLE `tb_congdan` (
  `id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
  `ten` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL,
  `cccd` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci,
  `email` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci,
  UNIQUE (cccd, email) 
  ) 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_congdan thành công!"; 
   } 
   // Đóng kết nối database
   mysql_close($conn);
?>

Kết quả:

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

ALTER TABLE Chỉ mục UNIQUE sau khi tạo bảng trong MySQL

ALTER TABLE Chỉ mục UNIQUE một cột sau khi tạo bảng trong MySQL

ALTER TABLE tb_congdan ADD CONSTRAINT U_cccd UNIQUE (cccd);
<?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_congdan`
   echo "<b>ALTER TABLE `tb_congdan`</b><br>";
   $sql ="ALTER TABLE tb_congdan
        ADD CONSTRAINT U_cccd UNIQUE (cccd)";
   $ketquamot = mysql_query($sql,$conn);
   if(!$ketquamot){
	  die('Không thể ALTER TABLE: ' . mysql_error());  
   }else{
	  echo "ALTER TABLE tb_congdan thành công!"; 
   } 
   // Đóng kết nối database
   mysql_close($conn);
?>

Kết quả:

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

ALTER TABLE Chỉ mục UNIQUE nhiều cột sau khi tạo bảng trong MySQL

ALTER TABLE tb_congdan ADD CONSTRAINT U_cccdemail UNIQUE (cccd,email);
<?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_congdan`
   echo "<b>ALTER TABLE `tb_congdan`</b><br>";
   $sql ="ALTER TABLE tb_congdan
        ADD CONSTRAINT U_cccdemail UNIQUE (cccd,email)";
   $ketquamot = mysql_query($sql,$conn);
   if(!$ketquamot){
	  die('Không thể ALTER TABLE: ' . mysql_error());  
   }else{
	  echo "ALTER TABLE tb_congdan thành công!"; 
   } 
   // Đóng kết nối database
   mysql_close($conn);
?>

Kết quả:

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

Xóa tên chỉ mục UNIQUE trong MySQL

ALTER TABLE tb_congdan DROP INDEX U_cccdemail;
<?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_congdan`
   echo "<b>ALTER TABLE `tb_congdan`</b><br>";
   $sql ="ALTER TABLE tb_congdan
          DROP INDEX U_cccdemail";
   $ketquamot = mysql_query($sql,$conn);
   if(!$ketquamot){
	  die('Không thể ALTER TABLE: ' . mysql_error());  
   }else{
	  echo "ALTER TABLE tb_congdan thành công!"; 
   } 
   // Đóng kết nối database
   mysql_close($conn);
?>

Kết quả:

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

Kiểm tra và xử lý chỉ mục UNIQUE trong MySQL

Sau khi tạo chỉ mục UNIQUE, việc kiểm tra cấu trúc và xử lý các trường hợp phát sinh sẽ giúp dữ liệu luôn được kiểm soát đúng. Đặc biệt, khi bảng đã có nhiều dữ liệu, bạn nên xác định rõ chỉ mục nào đang áp dụng trước khi thay đổi hoặc xóa.

Cách kiểm tra chỉ mục UNIQUE đang có trong bảng

Có thể dùng SHOW INDEX để xem toàn bộ chỉ mục của một bảng. Cột Non_unique có giá trị 0 cho biết chỉ mục đó không cho phép các giá trị bị trùng.

SHOW INDEX FROM users;

Nếu muốn kiểm tra cấu trúc bảng trực quan hơn, có thể sử dụng SHOW CREATE TABLE. Kết quả sẽ hiển thị cả phần khai báo chỉ mục UNIQUE cùng tên và các cột liên quan.

SHOW CREATE TABLE users;

Cách kiểm tra này hữu ích khi cần xác định một cột đang được ràng buộc UNIQUE trực tiếp hay nằm trong một chỉ mục UNIQUE gồm nhiều cột.

Cách xử lý lỗi trùng dữ liệu khi tạo UNIQUE

Khi thêm chỉ mục UNIQUE vào một cột đã tồn tại dữ liệu trùng nhau, MySQL sẽ không thể tạo chỉ mục. Trước tiên, cần tìm những giá trị xuất hiện nhiều lần để xác định dữ liệu cần xử lý.

SELECT email, COUNT(*) AS total
FROM users
GROUP BY email
HAVING COUNT(*) > 1;

Sau khi xác định các bản ghi trùng, bạn có thể chọn cách phù hợp như chỉnh sửa giá trị, gộp dữ liệu hoặc xóa bản ghi không còn cần thiết. Chỉ nên tạo UNIQUE sau khi dữ liệu đã đáp ứng điều kiện duy nhất.

Với chỉ mục UNIQUE gồm nhiều cột, cần kiểm tra tổ hợp các giá trị thay vì xem từng cột riêng lẻ. Ví dụ, hai bản ghi có thể cùng một mã nhưng vẫn hợp lệ nếu chúng thuộc hai nhóm khác nhau.

Cách thay đổi hoặc xóa chỉ mục UNIQUE

Khi yêu cầu dữ liệu thay đổi, bạn có thể xóa chỉ mục UNIQUE hiện tại rồi tạo lại chỉ mục theo cấu trúc mới. Trước khi thực hiện, nên kiểm tra các truy vấn đang sử dụng chỉ mục để tránh ảnh hưởng đến hoạt động của bảng.

ALTER TABLE users
DROP INDEX uk_users_email;

Sau khi xóa, nếu vẫn cần đảm bảo dữ liệu không trùng, có thể tạo một chỉ mục UNIQUE mới với cột phù hợp.

ALTER TABLE users
ADD UNIQUE INDEX uk_users_username (username);

Nên đặt tên chỉ mục rõ ràng để dễ nhận biết và quản lý khi cần kiểm tra, thay đổi hoặc xóa trong quá trình phát triển cơ sở dữ liệu.

Lời kết

Cảm ơn các bạn đã tham khảo bài viết Chỉ mục UNIQUE 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ề Chỉ mục UNIQUE 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) !