web-dev-qa-db-fra.com

MySQL - Signification de "PRIMARY KEY", "UNIQUE KEY" et "KEY" lorsqu'ils sont utilisés ensemble lors de la création d'une table

Quelqu'un peut-il expliquer le but de PRIMARY KEY, UNIQUE KEY et KEY, s’il est mis en un seul CREATE TABLE déclaration dans MySQL?

CREATE TABLE IF NOT EXISTS `tmp` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `uid` varchar(255) NOT NULL,
  `name` varchar(255) NOT NULL,
  `tag` int(1) NOT NULL DEFAULT '0',
  `description` varchar(255),
  PRIMARY KEY (`id`),
  UNIQUE KEY `uid` (`uid`),
  KEY `name` (`name`),
  KEY `tag` (`tag`)
) ENGINE=InnoDB AUTO_INCREMENT=1 ;

Comment convertir cette requête en MSSQL?

63
sura2k

Une clé est juste un index normal. Un moyen de simplification consiste à le considérer comme un catalogue de cartes dans une bibliothèque. Cela pointe MySQL dans la bonne direction.

Une clé unique est également utilisée pour améliorer la vitesse de recherche, mais elle impose qu’il ne puisse y avoir d’éléments dupliqués (il n’existe pas deux x et y où x n’est pas y et x == y).

Le manuel l'explique comme suit:

Un index UNIQUE crée une contrainte telle que toutes les valeurs de l'index doivent être distinctes. Une erreur se produit si vous essayez d'ajouter une nouvelle ligne avec une valeur de clé correspondant à une ligne existante. Cette contrainte ne s'applique pas aux valeurs NULL, à l'exception du moteur de stockage BDB. Pour les autres moteurs, un index UNIQUE autorise plusieurs valeurs NULL pour les colonnes pouvant contenir NULL. Si vous spécifiez une valeur de préfixe pour une colonne dans un index UNIQUE, les valeurs de colonne doivent être uniques dans le préfixe.

Une clé primaire est une clé unique "spéciale". C'est en fait une clé unique, sauf qu'elle est utilisée pour identifier quelque chose.

Le manuel explique comment les index sont utilisés en général: here .

Dans MSSQL, les concepts sont similaires. Il existe des index, des contraintes uniques et des clés primaires.

Non testé, mais je crois que l'équivalent MSSQL est:

CREATE TABLE tmp (
  id int NOT NULL PRIMARY KEY IDENTITY,
  uid varchar(255) NOT NULL CONSTRAINT uid_unique UNIQUE,
  name varchar(255) NOT NULL,
  tag int NOT NULL DEFAULT 0,
  description varchar(255),
);

CREATE INDEX idx_name ON tmp (name);
CREATE INDEX idx_tag ON tmp (tag);

Edit: le code ci-dessus est testé pour être correct; Cependant, je soupçonne qu'il existe une syntaxe bien meilleure pour le faire. Cela fait longtemps que je n'ai pas utilisé SQL Server, et apparemment, j'ai un peu oublié :).

90
Corbin

Pour ajouter aux autres réponses, le documentation donne cette explication:

  • KEY est normalement un synonyme de INDEX. L'attribut clé PRIMARY KEY peut aussi être spécifié simplement KEY lorsqu’il est donné dans une définition de colonne. Cela a été mis en œuvre pour la compatibilité avec d'autres systèmes de base de données.

  • Un index UNIQUE crée une contrainte telle que toutes les valeurs de l'index doivent être distinctes. Une erreur se produit si vous essayez d'ajouter une nouvelle ligne avec une valeur de clé correspondant à une ligne existante. Pour tous les moteurs, un index UNIQUE autorise plusieurs valeurs NULL pour les colonnes pouvant contenir NULL.

  • UNE PRIMARY KEY est un index unique dans lequel toutes les colonnes de clé doivent être définies comme NOT NULL. S'ils ne sont pas explicitement déclarés comme NOT NULL, MySQL les déclare de manière implicite (et silencieuse). Une table ne peut avoir qu'un seul PRIMARY KEY. Le nom d'un PRIMARY KEY est toujours PRIMARY, qui ne peut donc être utilisé comme nom pour aucun autre type d’index.

27
Paul Bellora

Les clés primaires et uniques de MySQL servent à identifier les lignes. Il ne peut y avoir qu'une seule clé primaire dans une table mais une ou plusieurs clés uniques. La clé est juste indexée.

pour plus de détails, vous pouvez vérifier http://www.geeksww.com/tutorials/database_management_systems/mysql/tips_and_tricks/mysql_primary_key_vs_unique_key_constraints.php

pour convertir mysql en mssql essayez ceci et voyez http://gathadams.com/2008/02/07/convert-mysql-to-ms-sql-server/

3
Wazan