Hướng dẫn unique trong mysql - duy nhất trong mysql

Trong bài tạo khóa chính Primary Key mình đã nói rằng trong một bảng sẽ tồn tại một khóa chính (có thể có nhiều fields) và giá trị của nó sẽ là duy nhất, nghĩa là dữ liệu sẽ không được trùng lặp. Vậy thì

CREATE TABLE Users(
   id INT PRIMARY KEY AUTO_INCREMENT,
   username VARCHAR(50) NOT NULL,
   email VARCHAR(50) NOT NULL,
   UNIQUE (username),
   UNIQUE (email)
);
1 cũng có tính chất tương tự như vậy, tức là nếu bạn xác định một field nào đó là UNIQUE dữ liệu của mỗi record không được trùng lặp nhau.

Hướng dẫn unique trong mysql - duy nhất trong mysql

Hướng dẫn unique trong mysql - duy nhất trong mysql

Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.freetuts.net, không được copy dưới mọi hình thức.

Vậy sự khác nhau giữa Primary Key và Unique là gì? Để trả lời ta sẽ tìm hiểu cú pháp tạo Unique trong MySQL đã nhé.Unique trong MySQL đã nhé.

1. Unique trong MySQL

CREATE TABLE Users(
   id INT PRIMARY KEY AUTO_INCREMENT,
   username VARCHAR(50) NOT NULL,
   email VARCHAR(50) NOT NULL,
   UNIQUE (username),
   UNIQUE (email)
);
2thực chất là một index
CREATE TABLE Users(
   id INT PRIMARY KEY AUTO_INCREMENT,
   username VARCHAR(50) NOT NULL,
   email VARCHAR(50) NOT NULL,
   UNIQUE (username),
   UNIQUE (email)
);
3 nên khi bạn thiết lập một field nào đó là
CREATE TABLE Users(
   id INT PRIMARY KEY AUTO_INCREMENT,
   username VARCHAR(50) NOT NULL,
   email VARCHAR(50) NOT NULL,
   UNIQUE (username),
   UNIQUE (email)
);
1 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

CREATE TABLE Users(
   id INT PRIMARY KEY AUTO_INCREMENT,
   username VARCHAR(50) NOT NULL,
   email VARCHAR(50) NOT NULL,
   UNIQUE (username),
   UNIQUE (email)
);
5 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
CREATE TABLE Users(
   id INT PRIMARY KEY AUTO_INCREMENT,
   username VARCHAR(50) NOT NULL,
   email VARCHAR(50) NOT NULL,
   UNIQUE (username),
   UNIQUE (email)
);
6 hoặc
CREATE TABLE Users(
   id INT PRIMARY KEY AUTO_INCREMENT,
   username VARCHAR(50) NOT NULL,
   email VARCHAR(50) NOT NULL,
   UNIQUE (username),
   UNIQUE (email)
);
7 để đă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à
CREATE TABLE Users(
   id INT PRIMARY KEY AUTO_INCREMENT,
   username VARCHAR(50) NOT NULL,
   email VARCHAR(50) NOT NULL,
   UNIQUE (username),
   UNIQUE (email)
);
1.Users(id, username, email) thì với
CREATE TABLE Users(
   id INT PRIMARY KEY AUTO_INCREMENT,
   username VARCHAR(50) NOT NULL,
   email VARCHAR(50) NOT NULL,
   UNIQUE (username),
   UNIQUE (email)
);
5 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
CREATE TABLE Users(
   id INT PRIMARY KEY AUTO_INCREMENT,
   username VARCHAR(50) NOT NULL,
   email VARCHAR(50) NOT NULL,
   UNIQUE (username),
   UNIQUE (email)
);
6 hoặc
CREATE TABLE Users(
   id INT PRIMARY KEY AUTO_INCREMENT,
   username VARCHAR(50) NOT NULL,
   email VARCHAR(50) NOT NULL,
   UNIQUE (username),
   UNIQUE (email)
);
7 để đă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à
CREATE TABLE Users(
   id INT PRIMARY KEY AUTO_INCREMENT,
   username VARCHAR(50) NOT NULL,
   email VARCHAR(50) NOT NULL,
   UNIQUE (username),
   UNIQUE (email)
);
1.

Như vậy sự khác biệt giữa

CREATE TABLE Users(
   id INT PRIMARY KEY AUTO_INCREMENT,
   username VARCHAR(50) NOT NULL,
   email VARCHAR(50) NOT NULL,
   UNIQUE (username),
   UNIQUE (email)
);
1 và
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);
0 là:

Bài viết này được đăng tại [free tuts .net]

  •  
    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);
    0 có cấp cao hơn
    CREATE TABLE Users(
       id INT PRIMARY KEY AUTO_INCREMENT,
       username VARCHAR(50) NOT NULL,
       email VARCHAR(50) NOT NULL,
       UNIQUE (username),
       UNIQUE (email)
    );
    1, nó  thường dùng để phân biệt giữa các record.
  • Trong mỗi bảng chỉ có có một
    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);
    0, còn
    CREATE TABLE Users(
       id INT PRIMARY KEY AUTO_INCREMENT,
       username VARCHAR(50) NOT NULL,
       email VARCHAR(50) NOT NULL,
       UNIQUE (username),
       UNIQUE (email)
    );
    1 thì có thể có nhiều

2. Tạo UNIQUE trong MySQL

Để 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

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);
5.

Tạo trong lệnh tạo bảng

Chúng ta sẽ thêm từ khóa

CREATE TABLE Users(
   id INT PRIMARY KEY AUTO_INCREMENT,
   username VARCHAR(50) NOT NULL,
   email VARCHAR(50) NOT NULL,
   UNIQUE (username),
   UNIQUE (email)
);
1 vào field mà ban muốn thiết lập nó là
CREATE TABLE Users(
   id INT PRIMARY KEY AUTO_INCREMENT,
   username VARCHAR(50) NOT NULL,
   email VARCHAR(50) NOT NULL,
   UNIQUE (username),
   UNIQUE (email)
);
1.

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

Trong trường hợp này chúng ta sẽ tạo bảng trước, sau đó sử dụng lệnh

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);
8 để thêm
CREATE TABLE Users(
   id INT PRIMARY KEY AUTO_INCREMENT,
   username VARCHAR(50) NOT NULL,
   email VARCHAR(50) NOT NULL,
   UNIQUE (username),
   UNIQUE (email)
);
1.

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

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ụ: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)

3. Xóa (Drop) Unique trong MySQL

Sau khi tạo

CREATE TABLE Users(
   id INT PRIMARY KEY AUTO_INCREMENT,
   username VARCHAR(50) NOT NULL,
   email VARCHAR(50) NOT NULL,
   UNIQUE (username),
   UNIQUE (email)
);
1 xong nếu bạn muốn bỏ nó đi thì sẽ sử dụng lệnh
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);
5 kết hợp với
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)
);
2. Tuy nhiên để xóa
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)
);
3 nào thì chúng ta phải biết được tên của nó, vì vậy ta nên dùng
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)
);
4 để tạo unique nhé. Sau đây là ví dụ xóa
CREATE TABLE Users(
   id INT PRIMARY KEY AUTO_INCREMENT,
   username VARCHAR(50) NOT NULL,
   email VARCHAR(50) NOT NULL,
   UNIQUE (username),
   UNIQUE (email)
);
1.

ALTER TABLE Users DROP INDEX user_unique

Các bạn lưu ý chữ thường chính là các chỗ bạn sẽ đổi còn chữ hoa là các keyword nên không được đổi nhé.

4. Lời kết

Bài này chủ yếu hướng dẫn cách tạo

CREATE TABLE Users(
   id INT PRIMARY KEY AUTO_INCREMENT,
   username VARCHAR(50) NOT NULL,
   email VARCHAR(50) NOT NULL,
   UNIQUE (username),
   UNIQUE (email)
);
1 trong
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)
);
7 và phân biệt nó với
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);
0, đây cũng là một dạng chỉ mục đóng vai trò rất quan trọng trong việc tối ưu hóa truy vấn. Bài này mình dừng ở đây, bài tiếp theo mình sẽ trình bày về thiết lập tăng tự động cho khóa chính (auto increment).

Ràng buộc UNIQUE trong MySQL

1) Chức năng của ràng buộc UNIQUE

- Ràng buộc UNIQUE dùng để thiết lập việc dữ liệu trên các hàng (trong cái bảng) không được phép trùng nhau.

- Một ràng buộc UNIQUE có thể được thiết lập cho một cột hoặc một tập hợp các cộtmột cột hoặc một tập hợp các cột

⛔ Nếu chúng ta thiết lập ràng buộc UNIQUE cho một cột thì dữ liệu trên các hàng của cột đó tuyệt đối không được trùng nhau.

⛔ Nếu chúng ta thiết lập ràng buộc UNIQUE cho một tập hợp các cột thì dữ liệu trên các hàng của một tập hợp các cột đó tuyệt đối không được trùng nhau.

- Trên một cái bảng có thể có nhiều ràng buộc UNIQUE.

2) Cách tạo ràng buộc UNIQUE cho một cột

- Để thiết lập ràng buộc UNIQUE cho một cột nào đó thì trong quá trình tạo bảng, chúng ta chỉ cần thêm từ khóa UNIQUE nằm phía sau tên cột là xong.

- Đoạn mã bên dưới dùng để tạo một cái bảng Customer. Trong đó, hai cột CustomerName & City bị thiết lập ràng buộc UNIQUE. Điều đó có nghĩa là tên của các khách hàng không được trùng nhau, thành phố của các khách hàng không được trùng nhau.

CREATE TABLE Customers(
	CustomerID INT,
	CustomerName VARCHAR(255) UNIQUE,
	PhoneNumber INT,
	City VARCHAR(255) UNIQUE
);

3) Cách tạo ràng buộc UNIQUE cho một tập hợp các cột

- Để thiết lập ràng buộc UNIQUE cho một tập hợp các cột thì chúng ta sử dụng cú pháp như sau:

CONSTRAINT tên_ràng_buộc UNIQUE(column1, column2, column3, ....) tên_ràng_buộc UNIQUE(column1, column2, column3, ....)

- Trong đó, cụm từ CONSTRAINT tên_ràng_buộc dùng để đặt tên cho ràng buộc, nếu chúng ta loại bỏ nó thì tên của cột column1 sẽ mặc định được sử dụng làm tên ràng buộc.CONSTRAINT tên_ràng_buộc dùng để đặt tên cho ràng buộc, nếu chúng ta loại bỏ nó thì tên của cột column1 sẽ mặc định được sử dụng làm tên ràng buộc.

- Trong cái bảng Customers bên dưới, tôi có tạo một cái ràng buộc UNIQUE tên là Hello500 dựa trên hai cột CustomerName & City. Điều đó đồng nghĩa với việc bên trong cái bảng Customers không được phép tồn tại những khách hàng có cùng tên & cùng thành phố.

CREATE TABLE Customers(
	CustomerID INT,
	CustomerName VARCHAR(255),
	PhoneNumber INT,
	City VARCHAR(255),
	CONSTRAINT Hello500 UNIQUE(CustomerName,City)
);

- Lưu ý: Việc tạo ràng buộc UNIQUE cho một tập hợp các cột & tạo ràng buộc UNIQUE cho nhiều cột là hoàn toàn khác nhau, để hiểu tại sao lại như vậy thì các bạn vui lòng xem ví dụ bên dưới.

CREATE TABLE Customers(
	CustomerID INT,
	CustomerName VARCHAR(255),
	PhoneNumber INT,
	City VARCHAR(255),
	UNIQUE(CustomerName,City)
);
CREATE TABLE Customers(
	CustomerID INT,
	CustomerName VARCHAR(255) UNIQUE,
	PhoneNumber INT,
	City VARCHAR(255) UNIQUE
);

- Hai đoạn mã nằm ở phía trên dùng để tạo cái bảng Customers, chúng đều có ràng buộc UNIQUE liên quan đến hai cột CustomerName & City. Tuy nhiên, đối với đoạn mã thứ nhất thì bên trong cái bảng Customers có thể có nhiều khách hàng trùng tên, có thể có nhiều khách hàng trùng thành phố, chỉ riêng trường hợp không được phép tồn tại các khách trùng tên lẫn thành phố.

- Còn đối với đoạn mã thứ hai thì nó sẽ mang ý nghĩa là bên trong cái bảng Customers không được phép có các khách hàng trùng tên, không được phép có các khách hàng trùng thành phố.

- Cú pháp thiết lập ràng buộc UNIQUE cho một tập hợp các cột cũng có thể được dùng cho trường hợp thiết lập ràng buộc UNIQUE cho riêng một cột.

4) Thêm ràng buộc UNIQUE (khi bảng đã được tạo)

- Đối với trường hợp bảng đã được tạo trước đó, nhưng do quên thiết lập ràng buộc UNIQUE cho cột nên bây giờ các bạn muốn bổ sung, để làm được điều đó thì chúng ta sử dụng lệnh chỉnh sửa bảng như bên dưới.

ALTER TABLE table_name ADD CONSTRAINT tên_ràng_buộc UNIQUE(column1, column2, column3); table_name ADD CONSTRAINT tên_ràng_buộc UNIQUE(column1, column2, column3);

- Ví dụ, để bổ sung ràng buộc UNIQUE cho cột PhoneNumber (trong cái bảng Customers) thì tôi sử dụng câu lệnh như bên dưới.

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

5) Cách xóa một ràng buộc UNIQUE

- Dưới đây là cú pháp dùng để xóa một ràng buộc UNIQUE.

ALTER TABLE table_name DROP INDEX tên_ràng_buộc; table_name DROP INDEX tên_ràng_buộc;

- Đối với trường hợp ràng buộc UNIQUE được thiết lập cho riêng một cột trong khi chúng ta không dùng cụm từ CONSTRAINT tên_ràng_buộc để đặt tên cho ràng buộc thì mặc định "tên ràng buộc" chính là tên của cái cột đó.