SQL anahtarları, MUL ve PRI ve UNI


248

Arasındaki fark nedir MUL, PRIve UNIMySQL?

Komutunu kullanarak bir MySQL sorgusu üzerinde çalışıyorum:

desc mytable; 

Alanlardan biri MULanahtar olarak, diğerleri ise UNIveya olarak gösterilir PRI.

Bir anahtar varsa PRI, tablo başına yalnızca bir kayıt bu anahtarla ilişkilendirilebilir biliyorum. Bir anahtar ise MUL, bu birden fazla ilişkili kaydın olabileceği anlamına mı geliyor?

İşte yanıtı mytable.

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

Yanıtlar:


158

Alanın benzersiz olmayan bir dizin (parçası) olduğu anlamına gelir. Sen verebilirsin

show create table <table>;

Tablo yapısı hakkında daha fazla bilgi görmek için.


2
Bu alan benzersiz olmayan bir dizinin (parçası) ise, neden MULdiğer tüm sütunlarda değil, yalnızca bu sütunda gösteriliyor?
Vikas Goel

1
İlgili başka sütunlar olması gerekmez. Benzersiz olmayan, aynı değerin bu sütunda birden çok kez oluşabileceği anlamına gelir .
pgoetz

425
DESCRIBE <table>; 

Bu acutally için bir kısayoldur:

SHOW COLUMNS FROM <table>;

Her durumda, "Anahtar" özelliği için üç olası değer vardır:

  1. PRI
  2. UNI
  3. MUL

Anlamı PRIve UNIoldukça açık:

  • PRI => birincil anahtar
  • UNI => benzersiz anahtar

Üçüncü olasılık, MUL(sorduğunuz) temelde ne birincil anahtar ne de benzersiz anahtar olan bir endekstir. Aynı değere sahip birden çok tekrarlamaya izin verildiğinden, ad "birden çok" öğesinden gelir. Doğrudan MySQL belgelerinden :

Eğer Keybir MULkolon belirli bir değeri birden fazla kopyasını sütun içinde izin verilen bir nonunique indeksinin ilk sütundur.

Son bir uyarı da var:

Anahtar değerlerinden birden fazlası tablonun belirli bir sütununa uygulanıyorsa, Anahtar, en yüksek önceliğe sahip olanı, sırasıyla PRI, UNIolarak görüntüler MUL.

Genel bir not olarak, MySQL belgeleri oldukça iyidir. Şüphe duyduğunuzda, kontrol edin!


3
"Birincil anahtarlar benzersiz değerler içermelidir." w3schools.com/sql/sql_primarykey.asp
ktm5124

6
Bazı bağlamlarda, MUL'in anahtarın yabancı bir anahtar olduğu anlamına gelebilir mi?
Armel Larcier

5
@robguinness, MySQL belgeleri İngilizce olmayanlar tarafından yazılmış gibi okunur. Çoğu zaman 1 satırla yapılabilecek bir şeyi açıklamak için 3 satır alacaklardı.
Pacerier


1
@pacerier, MySQL belgelerinin ayrıntı düzeyi konusunda size katılıyorum. Bu yüzden Stackoverflow genellikle kontrol ettiğim ilk yer, özellikle acelem varsa. ;-)
robguinness

86

MySQL'de MUL, PRI ve UNI nedir?

Gönderen MySQL 5.7 belgelerinde:

  • Anahtar PRI ise, sütun PRIMARY KEY veya çok sütunlu PRIMARY KEY sütunlarından biridir.
  • Anahtar UNI ise, sütun bir BENZERSİZ dizinin ilk sütunudur. (BENZERSİZ bir dizin birden çok NULL değerine izin verir, ancak Null alanını işaretleyerek sütunun NULL'a izin verip vermediğini söyleyebilirsiniz.)
  • Anahtar MUL ise, sütun, belirli bir değerin birden çok tekrarlanmasına izin verilen, benzersiz olmayan bir dizinin ilk sütunudur.

Canlı Örnekler

Kontrol grubu, bu örnekte ne PRI, MUL ne de UNI yoktur:

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)

Bir sütunu ve bir sütundaki bir dizini içeren bir tabloda bir MUL vardır:

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)

Birincil anahtar olan sütunu olan bir tabloda PRI vardır

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)

Benzersiz bir anahtar olan sütunu olan bir tabloda UNI bulunur:

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 ve bar'ı kapsayan bir dizin içeren bir tabloda yalnızca foo'da MUL vardır:

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)

İki sütunda iki ayrı dizine sahip bir tabloda her biri için MUL bulunur

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)

Üç sütunu kapsayan bir Dizine sahip bir tabloda ilkinde MUL bulunur:

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)

Başka bir tablonun birincil anahtarına başvuran yabancı anahtarlı bir tablo 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)

Bunu neokorteksinize yapıştırın ve kadranı "frappe" olarak ayarlayın.


6

Mul için bu benim için de yararlı bir dokümantı - http://grokbase.com/t/mysql/mysql/9987k2ew41/key-field-mul-newbie-question

"MUL, anahtarın birden çok satırın aynı değere sahip olmasına izin verdiği anlamına gelir. Yani, bu bir UNIque anahtarı değil."

Örneğin, Yayınla ve Yorumla olmak üzere iki modeliniz olduğunu varsayalım. Yayının Yorum ile has_many ilişkisi var. Yorum tablosunun bir MUL anahtarına (Post id) sahip olması mantıklı olacaktır çünkü birçok yorum aynı Postayla ilişkilendirilebilir.


4
EŞSİZ bir anahtar değilse, neden MUL olarak açıkça bahsedelim? Varsayılan olarak zaten EŞSİZ değil, değil mi? yoksa bir şey mi kaçırıyorum?
Sudip Bhandari

@SudipBhandari, dizini birincil veya benzersiz olmayan bir alana ayarlarsanız, MySQL anahtar türünü MUL olarak ayarlar, yukarıdaki açıklamaya ek olarak, bu tür türler MySQL'in hangi tür dizinle uğraştığını anlamasına yardımcı olur.
Adnan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.