SQL 키, MUL vs PRI vs UNI


247

차이점은 무엇이며 MUL, PRI그리고 UNIMySQL은은?

다음 명령을 사용하여 MySQL 쿼리를 작성 중입니다.

desc mytable; 

필드 중 하나가 MUL키로 표시되고 다른 필드는 UNI또는 로 표시됩니다 PRI.

키가 PRI인 경우 테이블 당 하나의 레코드 만 해당 키와 연관 될 수 있음을 알고 있습니다. 키가 MUL인 경우 둘 이상의 연관된 레코드가있을 수 있습니까?

의 답변은 다음과 같습니다 mytable.

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

답변:


158

이는 필드가 고유하지 않은 인덱스 (의 일부)임을 의미합니다. 당신은 발행 할 수 있습니다

show create table <table>;

테이블 구조에 대한 자세한 정보를 보려면


2
해당 필드가 고유하지 않은 인덱스의 일부인 경우 MUL다른 모든 열이 아닌 해당 열에 만 표시되는 이유는 무엇입니까?
Vikas Goel 2016 년

1
다른 열이 반드시 필요한 것은 아닙니다. 고유하지 않은 것은 해당 열에서 동일한 값이 두 번 이상 발생할 수 있음을 의미합니다 .
pgoetz

424
DESCRIBE <table>; 

이것은 바로 다음에 대한 바로 가기입니다.

SHOW COLUMNS FROM <table>;

어쨌든 "Key"속성에 대한 세 가지 가능한 값이 있습니다.

  1. PRI
  2. UNI
  3. MUL

의 의미 PRIUNI분명하다 :

  • PRI => 기본 키
  • UNI => 고유 키

세 번째 가능성 MUL은 (기본적으로 기본 키도 아니고 고유 키도 아닌) 인덱스입니다. 동일한 값을 여러 번 사용할 수 있으므로 이름은 "multiple"에서 유래합니다. 로부터 직선 의 MySQL 문서 :

경우 Key이고 MUL, 컬럼은 주어진 값을 여러 번가 칼럼 내의 허용 된 고유하지 않은 인덱스의 첫 번째 열이다.

마지막주의 사항도 있습니다.

키 값 중 하나 이상의 테이블의 특정 컬럼에 적용되는 경우, 키 표시 순서대로 우선 순위가 가장 높은 한, PRI, UNI, MUL.

일반적으로 MySQL 문서는 상당히 좋습니다. 확실하지 않으면 확인하십시오!


3
"기본 키는 고유 한 값을 포함해야합니다." w3schools.com/sql/sql_primarykey.asp
ktm5124

6
일부 상황에서 MUL이 키가 외래 키임을 의미한다고 말할 수 있습니까?
Armel Larcier

5
@robguinness, MySQL 문서는 영어 이외의 언어로 작성된 것처럼 읽습니다. 여러 번 그들은 한 줄로 할 수있는 것을 설명하기 위해 3 줄을 취할 것입니다.
Pacerier

12
또한 다른 테이블의 기본 키를 참조 하는 외래 가있는 테이블 은 MUL입니다.
Pacerier

1
@pacerier, 나는 MySQL 문서의 장황함에 관해 당신에게 동의합니다. 그렇기 때문에 Stackoverflow가 일반적으로 내가 체크 아웃하는 첫 번째 장소, 특히 서둘러야하는 이유입니다. ;-)
robguinness

86

MySQL에서 MUL, PRI 및 UNI는 무엇입니까?

보내는 사람 의 MySQL 5.7 문서 :

  • Key가 PRI 인 경우 열은 PRIMARY KEY이거나 다중 열 PRIMARY KEY의 열 중 하나입니다.
  • Key가 UNI 인 경우 열은 UNIQUE 인덱스의 첫 번째 열입니다. UNIQUE 인덱스는 여러 NULL 값을 허용하지만 Null 필드를 확인하여 열이 NULL을 허용하는지 여부를 알 수 있습니다.
  • Key가 MUL 인 경우, 열은 주어진 값의 여러 항목이 열 내에서 허용되는 고유하지 않은 인덱스의 첫 번째 열입니다.

라이브 예

제어 그룹,이 예에는 PRI, MUL 또는 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)

하나의 열과 하나의 열에 대한 색인이있는 테이블에는 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)

기본 키인 열이있는 테이블에는 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)

고유 키인 열이있는 테이블에는 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)

foo 및 bar를 포함하는 인덱스가있는 테이블은 foo에만 MUL이 있습니다.

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)

두 개의 열에 두 개의 개별 인덱스가있는 테이블은 각각에 대해 MUL을 갖습니다.

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)

세 개의 열에 걸쳐있는 인덱스가있는 테이블은 첫 번째에 MUL이 있습니다.

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)

다른 테이블의 기본 키를 참조하는 외래 키가있는 테이블은 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)

신피질에 붙이고 다이얼을 "frappe"로 설정하십시오.


6

도난의 경우,이 나에게도 도움이 문서이었다 - http://grokbase.com/t/mysql/mysql/9987k2ew41/key-field-mul-newbie-question

"MUL은 키가 여러 행이 동일한 값을 가질 수 있음을 의미합니다. 즉, 고유 키가 아닙니다."

예를 들어 Post와 Comment라는 두 가지 모델이 있다고 가정합니다. Post는 Comment와 has_many 관계를 가지고 있습니다. 많은 주석이 동일한 Post에 기인 할 수 있기 때문에 Comment 테이블이 MUL 키 (Post id)를 갖는 것이 이치에 맞습니다.


4
고유 키가 아닌 경우 MUL이라고 명시 적으로 언급 한 이유는 무엇입니까? 기본적으로 그것은 고유하지 않습니다. 아니면 뭔가 빠졌습니까?
Sudip Bhandari

@SudipBhandari 기본 및 고유 필드가 아닌 필드에서 인덱스를 설정하면 MySQL이 키 유형을 MUL로 설정하고 위의 설명 외에도 이러한 유형의 유형은 MySQL이 처리하는 인덱스의 종류를 이해하는 데 도움이됩니다.
Adnan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.