01/10/2018, 16:41

Bài 14: Tạo Unique trong MySQL

Đôi khi bạn muốn thiết lập các giá trị của một cột trong bảng không được trung lặp. Lấy ví vụ mỗi nhà cung cấp phải có một số Điện thoại duy nhất và không trùng nhau. Hoặc kết hợp giữa Tên và Địa chỉ không được trùng lặp. Để thực thi các điều kiến này, bạn cần sử dụng các chế UNIQUE. 1. ...

Đôi khi bạn muốn thiết lập các giá trị của một cột trong bảng không được trung lặp. Lấy ví vụ mỗi nhà cung cấp phải có một số Điện thoại duy nhất và không trùng nhau. Hoặc kết hợp giữa Tên và Địa chỉ không được trùng lặp.

Để thực thi các điều kiến này, bạn cần sử dụng các chế UNIQUE.

1. UNIQUE là gì?

UNIQUE là một loại dàng buộc nó không cho phép trong một cột của một bảng có hai hay nhiều bản ghi có giá trị trùng nhau(đồng khớp). Nghe như vậy thì bạn sẽ nghĩ đến khóa chính (PRIMARY KEY) trong MySQL.

Thì PRIMARY KEY và UNIQUE có nhữ điêm giống và khác như sau.

Điểm giống nhau:

  • UNIQUE và PRIMARY KEY không cho phép trong một cột có hai bản ghi trùng nhau.

Điểm khác nhau:

  • Primary Key có cấp cao hơn UNIQUE, nó  thường dùng để phân biệt giữa các record.
  • Trong mỗi bảng chỉ có có một Primary Key, còn UNIQUE thì có thể có nhiều

Thì UNIQUE thực chất nó là một Index KEY nên nếu bạn thiết lập một field nào đó là UNIQUE thì việc truy vấn dữ liệu trên nó sẽ nhanh hơn(Giống Index). Nó thường dùng trong trường hợp ngoài khóa chính ra thì bạn muốn Field đó phải là duy nhất.

2. Cách khai báo UNIQUE

Để thêm ràng buộc UNIQUE cho một cột thì ta có hai cách làm như sau:

  • Tạo trực tiếp thông qua câu lệnh tạo bảng.
  • Sử dụng lệnh ALTER TABLE để tạo.

2.1. Thông qua câu lệnh tạo bảng

Chúng ta sẽ thêm từ khóa UNIQUE vào phía sau của Field bạn muốn thiết lập.

CREATE TABLE [Tên_Bảng](
    [Tên_Cột] [Loại_Dữ_Liệu] UNIQUE,
);

Hoặc ta có thể thêm nó ở dưới danh sách các fields.

CREATE TABLE [Tên_Bảng](
   ...
   [Tên_Cột_1] [Loại_Dữ_liệu],
   [Tên_Cột_2] [Loại_Dữ_liệu],
   ...
   UNIQUE([Tên_Côt_1])
);

Nếu bạn thêm mới hoặc cập nhật một giá trị mà nó gây nên sự trùng lặp nội dung trong cột được thiết lập là UNIQUE. MySQL sẽ đưa ra một thông báo lỗi và từ chối các thay đổi này.

Trong trường hợp bạn muốn thực thi các giá trị UNIQUE thông qua các cột. Khí đó bạn phải xác định các ràng buộc UNIQUE cho một danh sách các cột tách nhau biwr dấu ",";

CREATE TABLE [Tên_Bảng](
   ...
   [Tên_Cột_1] [Loại_Dữ_liệu],
   [Tên_Cột_2] [Loại_Dữ_liệu],
   ...
   UNIQUE([Tên_Côt_1,Tên_Côt_2])
);

MySQL sẽ sử dụng kết hợp của các giá trị trong cả hai cột để đánh giá tính duy nhất trong trường hợp này.

Nếu bạn muốn gán một cái tên cụ thể cho một dàng buộc UNIQUE. Thì bạn có thể sử dụng mệnh đề đề CONSTRAINT như sau:

CREATE TABLE [Tên_Bảng](
   ...
   [Tên_Cột_1] [Loại_Dữ_liệu],
   [Tên_Cột_2] [Loại_Dữ_liệu],
   ...
   CONSTRAINT [Tên_Index] UNIQUE([Tên_Côt_1,Tên_Côt_2])
);

2.2 Sử Dụng Alter Table Để Tạo

Trong trường hợp này mặc đinh bảng phải được tạo trướ, sau đó sử dụng lệnh Alter Table để thêm UNIQUE.

CREATE TABLE [Tên_Bảng](
   ...
   [Tên_Cột_1] [Loại_Dữ_liệu],
   [Tên_Cột_2] [Loại_Dữ_liệu],
   ...
);

ALTER TABLE [Tên_Bảng] ADD UNIQUE([Tên_Cột_1]);
ALTER TABLE [Tên_Bảng] ADD UNIQUE([Tên_Cột_2]);

3. Xóa UNIQUE

Để loại bỏ một UNIQUE, bạn sử dụng có thể dùng DROP INDEX hoặc ALTER TABLE như sau.

DROP INDEX [Tên_Index] ON [Teen_Bảng];

Hoặc

ALTER TABLE [Tên_Bảng]
DROP INDEX [Tên_Index];

4. Ví dụ.

Đầu tiên bạn cần tạo mới một bảng e.g là suppilers với hai dàng buộc UNIQUE là phone và uc_name_address

CREATE TABLE IF NOT EXISTS suppliers (
    supplier_id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(255) NOT NULL,
    phone VARCHAR(12) NOT NULL UNIQUE,
    address VARCHAR(255) NOT NULL,
    CONSTRAINT uc_name_address UNIQUE (name , address)
);

Ràng buộc UNIQUE đầu tiên được áp dụng trên các cột phone. Nó có nghĩa rằng tất cả các nhà cung cấp phải có một số phone khác nhau. Nói cách khác, không có hai nhà cung cấp có cùng số phone.

Ràng buộc UNIQUE thứ hai có tên uc_name_address nó được áp dụng trên các cột name và address. Nó có nghĩa là các nhà cung cấp có thể có name hoặc address tương tự, nhưng không thể có name và address tương tự.

Bây giờ chúng ta sẽ thêm mới một bản ghi vào trong bảng suppliers

INSERT INTO suppliers(name, phone, address)
VALUES('VinaHost', '0943.07.07.07','27 Lạc Trung, Hai Bà Trưng, Hà Nội');
1 row(s) affected

Bây giờ chúng ta sẽ thử thêm mới một nhà cung cấp khác nhưng số phone đó thực sự là đã tồn tại trong bảng suppliers.

INSERT INTO suppliers(name, phone, address)
VALUES('TechHost', '0943.07.07.07','25 Lê Duẩn, Hà Nội');
[Err] 1062 - Duplicate entry '0943.07.07.0' for key 'phone'

Tiếp tục hãy thay đổi một só điện thoại khácvà thực hiện cậu lệnh INSERT

INSERT INTO suppliers(name, phone, address)
VALUES('TechHost', '0978.365.078','25 Lê Duẩn, Hà Nội');
1 row(s) affected

Tại đây bạn thực hiện câu lệnh SELECT để xem danh sách.

SELECT * FROM suppliers

Try In Out

Bây giờ chúng ta sẽ thực hiện một câu lệnh INSERT tiếp theo với điều kiện name và address thực sự đã tồn tại.

INSERT INTO suppliers(name, phone, address)
VALUES('TechHost', '0978.365.079','25 Lê Duẩn, Hà Nội');
[Err] 1062 - Duplicate entry 'TechHost-25 Lê Duẩn, Hà Nội' for key 'uc_name_address'

Để xóa UNIQUE có tên là  uc_name_address  trong bảng suppliers ta làm như sau.

DROP INDEX uc_name_address ON suppliers;

5. Tổng kết

Qua bài viết này bạn đã hiểu được UNIQUE là gì mục đích và cách sử dụng. Hy vọng bài viết giúp ích cho bạn.

Trịnh Tiến Mạnh

27 chủ đề

6824 bài viết

Cùng chủ đề
0