Khóa SQL, MUL vs PRI vs UNI


247

Sự khác nhau giữa là gì MUL, PRIUNItrong MySQL?

Tôi đang làm việc trên một truy vấn MySQL, sử dụng lệnh:

desc mytable; 

Một trong các trường được hiển thị là MULkhóa, các trường khác hiển thị dưới dạng UNIhoặc PRI.

Tôi biết rằng nếu một khóa là PRI, chỉ một bản ghi trên mỗi bảng có thể được liên kết với khóa đó. Nếu một khóa là MUL, điều đó có nghĩa là có thể có nhiều hơn một bản ghi liên quan?

Đây là câu trả lời của mytable.

+-----------+---------+------+-----+---------+-------+
| Field     | Type    | Null | Key | Default | Extra |
+-----------+---------+------+-----+---------+-------+
| courseid  | int(11) | YES  | MUL | NULL    |       | 
| dept      | char(3) | YES  |     | NULL    |       | 
| coursenum | char(4) | YES  |     | NULL    |       | 
+-----------+---------+------+-----+---------+-------+

Câu trả lời:


158

Nó có nghĩa là trường là (một phần) của một chỉ mục không duy nhất. Bạn có thể phát hành

show create table <table>;

Để xem thêm thông tin về cấu trúc bảng.


2
Nếu trường đó là (một phần) của một chỉ mục không duy nhất, thì tại sao MULchỉ hiển thị đối với cột đó mà không phải tất cả các cột khác.
Vikas Goel

1
Không nhất thiết phải có bất kỳ cột nào khác liên quan. Không duy nhất chỉ có nghĩa là cùng một giá trị có thể xảy ra nhiều lần trong cột đó .
pgoetz

424
DESCRIBE <table>; 

Đây thực sự là một phím tắt cho:

SHOW COLUMNS FROM <table>;

Trong mọi trường hợp, có ba giá trị có thể cho thuộc tính "Khóa":

  1. PRI
  2. UNI
  3. MUL

Ý nghĩa của PRIUNIkhá rõ ràng:

  • PRI => khóa chính
  • UNI => khóa duy nhất

Khả năng thứ ba MUL, (mà bạn đã hỏi về) về cơ bản là một chỉ mục không phải là khóa chính cũng không phải là khóa duy nhất. Tên đến từ "nhiều" vì nhiều lần xuất hiện của cùng một giá trị được cho phép. Trực tiếp từ tài liệu MySQL :

Nếu KeyMUL, cột là cột đầu tiên của một chỉ mục nonunique trong đó nhiều lần xuất hiện của một giá trị nhất định được cho phép trong cột.

Ngoài ra còn có một cảnh báo cuối cùng:

Nếu có nhiều hơn một trong những giá trị chính áp dụng đối với một cột nhất định của một bảng, màn hình chính là người có mức ưu tiên cao nhất, theo thứ tự PRI, UNI, MUL.

Như một lưu ý chung, tài liệu MySQL là khá tốt. Khi nghi ngờ, hãy kiểm tra nó!


3
"Khóa chính phải chứa các giá trị duy nhất." w3schools.com/sql/sql_primarykey.asp
ktm5124

6
Có thể nói, trong một số bối cảnh, MUL có nghĩa là khóa là khóa ngoại ??
Armel Larcier

4
@robguinness, tài liệu MySQL đọc giống như được viết bởi không phải tiếng Anh. Nhiều lần họ sẽ mất 3 dòng để giải thích điều gì đó có thể được thực hiện với 1 dòng.
Pacerier


@pacerier, tôi đồng ý với bạn về tính dài dòng của tài liệu MySQL. Đó là lý do tại sao Stackoverflow thường là nơi đầu tiên tôi kiểm tra, đặc biệt nếu tôi đang vội. ;-)
cướp

86

Mặc dù MUL, PRI và UNI trong MySQL là gì?

Từ tài liệu MySQL 5.7 :

  • Nếu Key là PRI, thì cột là KEY PRIMARY hoặc là một trong những cột trong KEY PRIMARY KEY nhiều cột.
  • Nếu Key là UNI, thì cột là cột đầu tiên của chỉ mục UNIQUE. (Chỉ mục UNIQUE cho phép nhiều giá trị NULL, nhưng bạn có thể biết liệu cột có cho phép NULL hay không bằng cách kiểm tra trường Null.)
  • Nếu Key là MUL, thì cột là cột đầu tiên của chỉ mục nonunique trong đó nhiều lần xuất hiện của một giá trị đã cho phép được cho phép trong cột.

Ví dụ trực tiếp

Nhóm kiểm soát, ví dụ này không có PRI, MUL hay UNI:

mysql> create table penguins (foo INT);
Query OK, 0 rows affected (0.01 sec)

mysql> desc penguins;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| foo   | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)

Một bảng có một cột và một chỉ mục trên một cột có MUL:

mysql> create table penguins (foo INT, index(foo));
Query OK, 0 rows affected (0.01 sec)

mysql> desc penguins;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| foo   | int(11) | YES  | MUL | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)

Một bảng có một cột là khóa chính có PRI

mysql> create table penguins (foo INT primary key);
Query OK, 0 rows affected (0.02 sec)

mysql> desc penguins;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| foo   | int(11) | NO   | PRI | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)

Một bảng có một cột là một khóa duy nhất có UNI:

mysql> create table penguins (foo INT unique);
Query OK, 0 rows affected (0.01 sec)

mysql> desc penguins;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| foo   | int(11) | YES  | UNI | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)

Một bảng có chỉ mục bao gồm foo và thanh chỉ có MUL trên foo:

mysql> create table penguins (foo INT, bar INT, index(foo, bar));
Query OK, 0 rows affected (0.01 sec)

mysql> desc penguins;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| foo   | int(11) | YES  | MUL | NULL    |       |
| bar   | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)

Một bảng có hai chỉ mục riêng biệt trên hai cột có MUL cho mỗi cột

mysql> create table penguins (foo INT, bar int, index(foo), index(bar));
Query OK, 0 rows affected (0.01 sec)

mysql> desc penguins;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| foo   | int(11) | YES  | MUL | NULL    |       |
| bar   | int(11) | YES  | MUL | NULL    |       |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)

Một bảng có Index bao gồm ba cột có MUL trên đầu tiên:

mysql> create table penguins (foo INT, 
       bar INT, 
       baz INT, 
       INDEX name (foo, bar, baz));
Query OK, 0 rows affected (0.01 sec)

mysql> desc penguins;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| foo   | int(11) | YES  | MUL | NULL    |       |
| bar   | int(11) | YES  |     | NULL    |       |
| baz   | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
3 rows in set (0.00 sec)

Một bảng có khóa ngoại tham chiếu khóa chính của bảng khác là MUL

mysql> create table penguins(id int primary key);
Query OK, 0 rows affected (0.01 sec)

mysql> create table skipper(id int, foreign key(id) references penguins(id));
Query OK, 0 rows affected (0.01 sec)

mysql> desc skipper;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | YES  | MUL | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)

mysql> desc penguins;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | NO   | PRI | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)

Dán nó trong neocortex của bạn và đặt mặt số thành "frappe".


6

Đối với Mul, đây cũng là tài liệu hữu ích với tôi - http://grokbase.com/t/mysql/mysql/9987k2ew41/key-field-mul-newbie-question

"MUL có nghĩa là khóa cho phép nhiều hàng có cùng giá trị. Đó không phải là khóa UNIque."

Ví dụ: giả sử bạn có hai mô hình, Đăng và Nhận xét. Bài đăng có mối quan hệ has_many với Nhận xét. Sau đó, sẽ có ý nghĩa khi bảng Nhận xét có khóa MUL (Id bài đăng) vì nhiều bình luận có thể được quy cho cùng một Bài đăng.


4
Nếu nó không phải là một khóa UNIITE, tại sao lại đề cập rõ ràng là MUL? Theo mặc định, dù sao nó cũng không phải là ĐỘC ĐÁO, phải không? hoặc tôi đang thiếu một cái gì đó?
Sudip Bhandari

@SudipBhandari nếu bạn đặt chỉ mục trên một trường không chính cũng không phải duy nhất thì MySQL sẽ đặt loại khóa là MUL, ngoài giải thích ở trên, các loại như vậy giúp MySQL hiểu loại chỉ mục mà nó đang xử lý.
Ad Nam
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.