> For the complete documentation index, see [llms.txt](https://learnsql.gitbook.io/lernmysql/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://learnsql.gitbook.io/lernmysql/welcome-to-the-mysql-tutorial/unique-trong-mysql.md).

# Unique trong MySQL

`UNIQUE`thực chất là một index `KEY` nên khi bạn thiết lập một field nào đó là `UNIQUE` thì việc truy vấn dữ liệu trên field đó sẽ nhanh hơn. Nó được dùng trong trường hợp bạn muốn tạo thêm một field có giá trị là duy nhất.

Ví dụ trong bảng Users gồm các fields như sau: **Users(id, username, email)** thì với `id` ta sẽ chọn làm khóa chính. Nhưng mà tôi muốn email và username của người dùng phải là duy nhất, nghĩa là người dùng không được sử dụng một `email` hoặc `username` để đăng ký nhiều tài khoản. Để giải quyết thì ta sẽ thiết lập cho hai fields này là `UNIQUE`.

Như vậy sự khác biệt giữa `UNIQUE` và `Primary Key` là:

* &#x20;`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

### Tạo UNIQUE trong MySQL <a href="#goto-h2-1" id="goto-h2-1"></a>

Để tạo UNIQUE ta có hai cách, cách thứ nhất là tạo trực tiếp trong lệnh CREATE TABLE và cách thứ hai là sử dụng lệnh `ALTER TABLE`.

#### Tạo trong lệnh tạo bảng <a href="#goto-h3-0" id="goto-h3-0"></a>

Chúng ta sẽ thêm từ khóa `UNIQUE` vào field mà ban muốn thiết lập nó là `UNIQUE`.

```
CREATE TABLE Users(
   id INT PRIMARY KEY AUTO_INCREMENT,
   username VARCHAR(50) NOT NULL UNIQUE,
   email VARCHAR(50) NOT NULL UNIQUE
);
```

Hoặc ta có thể thêm nó ở dưới danh sách các fields (giống Primary Key).

```
CREATE TABLE Users(
   id INT PRIMARY KEY AUTO_INCREMENT,
   username VARCHAR(50) NOT NULL,
   email VARCHAR(50) NOT NULL,
   UNIQUE (username),
   UNIQUE (email)
);
```

#### Sử dụng Alter Table để tạo <a href="#goto-h3-1" id="goto-h3-1"></a>

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

```
CREATE TABLE Users(
   id INT PRIMARY KEY AUTO_INCREMENT,
   username VARCHAR(50) NOT NULL,
   email VARCHAR(50) NOT NULL
);
 
ALTER TABLE Users ADD UNIQUE(username);
ALTER TABLE Users ADD UNIQUE(email);
```

#### Sử dụng CONSTRAINT để tạo tên cho UNIQUE <a href="#goto-h3-2" id="goto-h3-2"></a>

Cách này **khuyến khích sử dụng** vì mỗi index chúng ta nên đặt cho nó một cái tên để sau này muốn thực hiện thao tác delete unique thì sẽ dựa vào tên constraint đó.  Ví dụ:

```
CREATE TABLE Users(
   id INT PRIMARY KEY AUTO_INCREMENT,
   username VARCHAR(50) NOT NULL,
   email VARCHAR(50) NOT NULL,
   CONSTRAINT user_unique UNIQUE (username),
   CONSTRAINT email_unique UNIQUE (email)
);
```

**Hoặc**:

```
ALTER TABLE Users ADD CONSTRAINT user_unique UNIQUE (username)
```

### Xóa (Drop) Unique trong MySQL <a href="#goto-h2-2" id="goto-h2-2"></a>

Sau khi tạo `UNIQUE` xong nếu bạn muốn bỏ nó đi thì sẽ sử dụng lệnh `ALTER TABLE` kết hợp với `DROP`. Tuy nhiên để xóa `UNIQE` nào thì chúng ta phải biết được tên của nó, vì vậy ta nên dùng `CONSTRAINT` để tạo unique nhé. Sau đây là ví dụ xóa `UNIQUE`.

```
ALTER TABLE Users DROP INDEX user_unique
```
