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?
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é :).
Pour ajouter aux autres réponses, le documentation donne cette explication:
KEY
est normalement un synonyme deINDEX
. L'attribut cléPRIMARY KEY
peut aussi être spécifié simplementKEY
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 indexUNIQUE
autorise plusieurs valeursNULL
pour les colonnes pouvant contenirNULL
.UNE
PRIMARY KEY
est un index unique dans lequel toutes les colonnes de clé doivent être définies commeNOT NULL
. S'ils ne sont pas explicitement déclarés commeNOT NULL
, MySQL les déclare de manière implicite (et silencieuse). Une table ne peut avoir qu'un seulPRIMARY KEY
. Le nom d'unPRIMARY KEY
est toujoursPRIMARY
, qui ne peut donc être utilisé comme nom pour aucun autre type d’index.
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/