Sự khác biệt giữa Khóa, Khóa chính, Khóa duy nhất và Chỉ mục trong MySQL


250

Khi nào tôi nên sử dụng KEY, PRIMARY KEY, UNIQUE KEYINDEX?


2
Khóa PRIMARY là để xác định các hàng, ngăn không cho chèn hai hàng có cùng dữ liệu giống nhau ... Khóa INDEX là để tăng tốc tìm kiếm (chèn chậm tối thiểu). Khóa UNIQUE cho dữ liệu duy nhất trong một cột.
Hos Mercury


Câu trả lời:


303

KEYINDEXlà từ đồng nghĩa trong MySQL. Họ có nghĩa là điều tương tự. Trong cơ sở dữ liệu, bạn sẽ sử dụng các chỉ mục để cải thiện tốc độ truy xuất dữ liệu. Một chỉ số thường được tạo ra trên các cột được sử dụng trong JOIN, WHEREORDER BYmệnh đề.

Hãy tưởng tượng bạn có một bảng được gọi usersvà bạn muốn tìm kiếm tất cả người dùng có họ 'Smith'. Nếu không có chỉ mục, cơ sở dữ liệu sẽ phải đi qua tất cả các bản ghi của bảng: điều này chậm, bởi vì bạn càng có nhiều bản ghi trong cơ sở dữ liệu của mình, bạn càng phải làm nhiều việc hơn để tìm kết quả. Mặt khác, một chỉ mục sẽ giúp cơ sở dữ liệu nhanh chóng chuyển đến các trang có liên quan nơi lưu giữ hồ sơ của 'Smith'. Điều này rất giống với cách chúng ta, con người, đi qua một danh bạ danh bạ điện thoại để tìm ai đó bằng tên cuối cùng: Chúng ta không bắt đầu tìm kiếm qua thư mục từ trang bìa đến trang bìa, miễn là chúng ta chèn thông tin theo một số thứ tự mà chúng ta có thể sử dụng để nhanh chóng chuyển đến các trang 'S'.

Khóa chính và khóa duy nhất là tương tự nhau. Khóa chính là một cột hoặc kết hợp các cột, có thể xác định duy nhất một hàng. Đây là một trường hợp đặc biệt của khóa duy nhất . Một bảng có thể có nhiều nhất một khóa chính, nhưng nhiều hơn một khóa duy nhất. Khi bạn chỉ định một khóa duy nhất trên một cột, không có hai hàng riêng biệt trong một bảng có thể có cùng giá trị.

Cũng lưu ý rằng các cột được xác định là khóa chính hoặc khóa duy nhất được tự động lập chỉ mục trong MySQL.


2
Tôi có thể có cả khóa duy nhất và khóa chính có cùng giá trị không?
GIÚP

58
@needHELP: Nếu bạn có một bảng được gọi passengersvới các trường sau : (id, first_name, last_name, age, passport_number), bạn thường thiết lập idcột làm khóa chính. Khóa chính tự động là khóa duy nhất. Sự khác biệt chính là bạn chỉ có thể có một khóa chính trên bảng và cột không thể chứa NULLcác giá trị. Không cần phải thiết lập các idcột là UNIQUEvì bằng cách thiết lập nó vào một khóa chính, nó sẽ tự động được bảo đảm là duy nhất ... Sau đó, bạn cũng có thể thiết lập passport_numberđể UNIQUEsao cho không có nhiều hơn một hành khách ...
Daniel Vassallo

32
... sẽ có thể có cùng số hộ chiếu. Tuy nhiên, bạn có thể có một số hành khách (ví dụ như trẻ em) mà không có số hộ chiếu. Trong trường hợp đó, bạn có thể chèn NULLvào cột đó mà không gặp vấn đề gì.
Daniel Vassallo

2
@DanielVassallo Tôi thích cách bạn xóa nó giữa các từ đồng nghĩa được sử dụng bởi MySQL.
CUỘC SỐNG

1
Một trong những lời giải thích tốt nhất. Cảm ơn rất nhiều :-)
Ravi Hirani

61

KEY và INDEX là từ đồng nghĩa.

Bạn nên thêm một chỉ mục khi đo hiệu suất và GIẢI THÍCH cho bạn thấy rằng truy vấn không hiệu quả do thiếu chỉ mục. Thêm một chỉ mục có thể cải thiện hiệu suất của các truy vấn (nhưng nó có thể làm chậm các sửa đổi đối với bảng).

Bạn nên sử dụng ĐỘC ĐÁO khi bạn muốn biến các giá trị trong cột đó (hoặc cột) thành duy nhất, để cố gắng chèn các giá trị trùng lặp dẫn đến lỗi.

Một khóa CHÍNH là cả một ràng buộc duy nhất và nó cũng ngụ ý rằng cột KHÔNG phải là NULL. Nó được sử dụng để cung cấp một danh tính cho mỗi hàng. Điều này có thể hữu ích để tham gia với một bảng khác thông qua ràng buộc khóa ngoài. Mặc dù không bắt buộc bảng phải có KHÓA CHÍNH, nhưng đó thường là một ý tưởng tốt.


KEY PRIMARY được sử dụng để cung cấp một danh tính cho mỗi hàng? giải thích xin lỗi cho sự thiếu hiểu biết của tôi.
GIÚP

@needHELP: Nó được sử dụng như một cách để xác định duy nhất bất kỳ hàng nào trong bảng của bạn. Ví dụ: nếu bạn muốn xóa một hàng cụ thể trong bảng của mình, thật hữu ích khi có một số cách để xác định rõ ràng để bạn không vô tình xóa hàng sai. Nó cũng hữu ích để tham gia với một bảng khác vì nó được lập chỉ mục.
Mark Byers

48

Khóa chính không cho phép NULLcác giá trị, nhưng khóa duy nhất cho phép NULLcác giá trị.

Chúng ta chỉ có thể khai báo một khóa chính trong một bảng, nhưng một bảng có thể có nhiều khóa khóa duy nhất (gán cột).


17

PRIMARY KEYUNIQUE KEY tương tự ngoại trừ nó có chức năng khác nhau. Khóa chính làm cho hàng của bảng duy nhất (nghĩa là không thể có 2 hàng với cùng một khóa chính xác). Bạn chỉ có thể có 1 khóa chính trong bảng cơ sở dữ liệu.

Khóa duy nhất làm cho cột bảng trong một hàng của bảng là duy nhất (nghĩa là không có hàng 2 bảng nào có thể có cùng giá trị chính xác). Bạn có thể có nhiều hơn 1 cột bảng duy nhất (không giống như khóa chính có nghĩa là chỉ có 1 cột trong bảng là duy nhất).

INDEXcũng tạo ra sự độc đáo. MySQL (ví dụ) sẽ tạo một bảng lập chỉ mục cho cột được lập chỉ mục. Theo cách này, việc truy xuất giá trị hàng của bảng dễ dàng hơn khi truy vấn được truy vấn trên cột bảng được lập chỉ mục đó. Nhược điểm là nếu bạn thực hiện nhiều cập nhật / xóa / tạo, MySQL phải quản lý các bảng lập chỉ mục (và đó có thể là một nút cổ chai hiệu năng).

Hi vọng điêu nay co ich.


Ngoài ra, UNIQUE KEYcó thể NULLnhưng PRIMARY KEYkhông thể được NULL.
Rafay

10

Khóa duy nhất: Các cột không có hai hàng giống nhau

Khóa chính: Tập hợp số lượng cột tối thiểu có thể xác định duy nhất mỗi hàng trong một bảng (nghĩa là không có hai hàng nào giống nhau trong tất cả các cột cấu thành khóa chính). Có thể có nhiều hơn một khóa chính trong một bảng. Nếu tồn tại một khóa duy nhất thì đó là khóa chính (không phải "khóa chính" trong bảng. Nếu không tồn tại một khóa duy nhất thì sẽ cần nhiều hơn một giá trị cột để xác định một hàng như (First_name, last_name, cha_name, Mother_name) trong một số bảng có thể tạo thành khóa chính.

Index: được sử dụng để tối ưu hóa các truy vấn. Nếu bạn định tìm kiếm hoặc sắp xếp kết quả trên cơ sở một số cột nhiều lần (ví dụ: hầu hết mọi người sẽ tìm kiếm các sinh viên theo tên chứ không phải theo số cuộn của họ.) Thì có thể tối ưu hóa nếu tất cả các giá trị cột " lập chỉ mục "ví dụ với thuật toán cây nhị phân.


Tôi nghĩ bạn muốn nói rằng chỉ có một PK trong một bảng
Răzvan Flavius ​​Panda

7

Khóa chính - chúng ta chỉ có thể đặt một khóa chính trên bảng vào một bảng và chúng ta không thể để trống cột đó khi chúng ta nhập các giá trị vào bảng.

Khóa duy nhất - chúng ta có thể đặt nhiều hơn một khóa duy nhất trên một bảng và chúng ta có thể để trống cột đó khi chúng ta nhập các giá trị vào bảng. cột lấy các giá trị duy nhất (không giống nhau) khi chúng tôi áp dụng khóa chính & duy nhất.


bảng chỉ có một phím CHÍNH, nhưng các khóa duy nhất có nhiều hơn một.
VIKASH

6

Khóa chính được sử dụng để làm việc với các bảng khác nhau. Đây là nền tảng của cơ sở dữ liệu quan hệ. Nếu bạn có cơ sở dữ liệu sách, tốt hơn là tạo 2 bảng - 1) sách và 2) tác giả với "id" khóa chính INT. Sau đó, bạn sử dụng id trong sách thay vì tên tác giả.

Khóa duy nhất được sử dụng nếu bạn không muốn có các mục lặp lại. Ví dụ, bạn có thể có tiêu đề trong bảng sách của mình và muốn chắc chắn rằng chỉ có một mục nhập cho mỗi tên sách.


2

Khóa duy nhất:

  1. Nhiều giá trị có thể là null.
  2. Không có hai bộ dữ liệu có thể có cùng giá trị trong khóa duy nhất.
  3. Một hoặc nhiều khóa duy nhất có thể được kết hợp để tạo thành khóa chính, nhưng không phải ngược lại.

Khóa chính

  1. Có thể chứa nhiều hơn một khóa duy nhất.
  2. Độc đáo đại diện cho một tuple.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.