web-dev-qa-db-fra.com

MySql - La clé primaire est-elle unique par défaut?

Si je définis une colonne comme clé primaire dans MySql, est-ce aussi une clé unique par défaut ou dois-je également la définir comme clé unique (au cas où je souhaiterais qu'elle soit unique)?

J'ai vu cette question Quelle est la différence n/b clé primaire et clé unique qui explique la différence entre les deux mais ne répond pas exactement à ma question. Est-ce que PK est UK par défaut ou je dois le définir explicitement.

29
Roee Gavirel

La clé primaire est toujours unique dans chaque SQL. Vous n'avez pas à le définir explicitement comme UNIQUE.

Sur une note latérale: Vous ne pouvez avoir qu'une seule clé primaire dans une table et elle n'autorise jamais les valeurs nulles. De plus, vous ne pouvez avoir qu'une seule contrainte de clé primaire dans la table (car le but de la création d'une clé primaire est d'identifier de manière unique la ligne de votre table) mais vous pouvez plus d'une contrainte de clé unique dans votre table.

Exemple:

Une table de détails des employés ayant EmpID comme clé primaire et EmpPhoneNo comme clé unique.

37
Rahul Tripathi

La clé primaire est toujours unique par définition. Pas seulement dans MySQL. Vous n'avez donc pas besoin de clé unique supplémentaire.

4
Jakub Matczak

Notez que les clés composites peuvent être source de confusion: en effet, une clé primaire peut être une clé composite et DESCRIBE affichera tous les composants de la clé composite comme clés primaires:

> DESCRIBE foobar;
+----------------------+------------------+------+-----+---------+-------+
| Field                | Type             | Null | Key | Default | Extra |
+----------------------+------------------+------+-----+---------+-------+
| column_A             | int(10) unsigned | NO   | PRI | NULL    |       |
| column_B             | int(10) unsigned | NO   | PRI | NULL    |       |
+----------------------+------------------+------+-----+---------+-------+

Pourtant SHOW CREATE TABLE montrera la réalité:

> SHOW CREATE TABLE foobar;
+--------+---------------------------…+
| Table  | Create Table              …|
+--------+---------------------------…+
| foobar | CREATE TABLE `foobar` (
  `column_A` int(10) unsigned NOT NULL,
  `column_B` int(10) unsigned NOT NULL,
  PRIMARY KEY (`column_A`,`column_B`),
  KEY `column_B` (`column_B`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+--------+---------------------------…+
1