66 votes

MySql - Signification de "PRIMARY KEY", "UNIQUE KEY" et "KEY" lorsqu'ils sont utilisés ensemble

Quelqu'un peut-il expliquer l'objectif de PRIMARY KEY , UNIQUE KEY et KEY s'ils l'assemblent dans une seule déclaration CREATE TABLE 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?

92voto

Corbin Points 17420

Une clé est juste un indice normal. Un chemin sur la simplification est de la penser comme une carte de catalogue à la bibliothèque. C'points de MySQL dans la bonne direction.

Une clé unique est également utilisé pour améliorer la recherche de vitesse, mais il a la contrainte qu'il n'existe pas d'éléments dupliqués (il n'y a pas deux x et y où x n'est pas y et x == y).

Le manuel explique comme suit:

Un index UNIQUE crée une contrainte telle que toutes les valeurs de l'indice doivent être distinctes. Une erreur se produit si vous essayez d'ajouter une nouvelle ligne avec un valeur de la clé qui correspond à une ligne existante. Cette contrainte ne s'applique pas pour les valeurs NULL, sauf pour la BDB moteur de stockage. Pour les autres moteurs, un Index UNIQUE permet à plusieurs valeurs NULL pour les colonnes qui peuvent contenir La valeur NULL. Si vous spécifiez une valeur de préfixe pour une colonne dans un index UNIQUE, les valeurs de la colonne doit être unique dans le préfixe.

Une clé primaire est un "spécial" clé unique. C'est fondamentalement une clé unique, sauf que c'est utilisé pour identifier quelque chose.

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

En MSSQL, les concepts sont similaires. Il y a des indices, des contraintes uniques et des clés primaires.

Pas testé, mais je crois que la MSSQL équivalent 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 correcte; toutefois, je soupçonne qu'il y a une bien meilleure syntaxe pour le faire. Été un moment depuis que j'ai utilisé SQL server, et apparemment j'ai oublié un peu :).

29voto

Paul Bellora Points 26524

Juste pour ajouter d'autres réponses, la documentation donne cette explication:

  • KEY est normalement synonyme INDEX. L'attribut clé PRIMARY KEYpeut également être spécifié comme juste KEY lorsqu'il est administré dans une définition de colonne. Cette a été mis en œuvre pour assurer la compatibilité avec d'autres systèmes de base de données.

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

  • Un PRIMARY KEY est un index unique où toutes les colonnes de clé doit être défini en tant que NOT NULL. Si elles ne sont pas explicitement déclarées comme NOT NULL, MySQL déclare implicitement (et en silence). Une table ne peut avoir qu'un PRIMARY KEY. Le nom d'un PRIMARY KEY toujours PRIMARY, qui est donc ne peut pas être utilisé comme nom pour tout autre type d'index.

3voto

Wazan Points 322

MySQL unique et des clés primaires servent à identifier les lignes. Il peut y avoir qu'une seule clé Primaire dans une table, mais une ou plusieurs touches. La clé est juste de l'index.

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 mssql essayer cela et voir http://gathadams.com/2008/02/07/convert-mysql-to-ms-sql-server/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X