2012-06-06 28 views
56

¿Puede alguien explicar sobre el propósito de PRIMARY KEY, UNIQUE KEY y KEY si se ponen juntos en un solo CREATE TABLE declaración en MySQL?MySQL - Significado de "PRIMARY KEY", "UNIQUE KEY" y "CLAVE" cuando se usan juntos, mientras que la creación de una mesa

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 ; 

¿Cómo convierto esta consulta a MySQL?

+3

relacionados: [? Palabra clave CLAVE de MySQL] (http://stackoverflow.com/q/924265/697449) Básicamente 'KEY' es sinónimo de' INDEX'. –

Respuesta

80

Una de las claves es sólo un índice normal. Una forma de simplificar es pensarlo como un catálogo de tarjetas en una biblioteca. Apunta a MySQL en la dirección correcta.

Una clave única también se usa para mejorar la velocidad de búsqueda, pero tiene la restricción de que no puede haber elementos duplicados (no hay dos x y y donde x no es y y x == y).

El manual lo explica de la siguiente manera:

un índice único crea una restricción de tal manera que todos los valores del índice de deben ser distintos. Se produce un error si intenta agregar una nueva fila con un valor de clave que coincida con una fila existente. Esta restricción no aplica a valores NULOS excepto para el motor de almacenamiento BDB. Para otros motores, un índice UNIQUE permite valores NULL múltiples para columnas que pueden contener NULL. Si especifica un valor de prefijo para una columna en un índice UNIQUE, , los valores de columna deben ser únicos dentro del prefijo.

Una clave principal es una clave única 'especial'. Básicamente es una clave única, excepto que se usa para identificar algo.

El manual explica cómo se usan los índices en general: here.

En MSSQL, los conceptos son similares. Hay índices, restricciones únicas y claves principales.

probado, pero creo que el MSSQL equivalente es:

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); 

Editar: el código anterior se prueba para ser correcta; sin embargo, sospecho que hay una sintaxis mucho mejor para hacerlo. Hace tiempo que uso el servidor SQL, y aparentemente me olvidé bastante :).

+1

¡Gran explicación! El código está funcionando bien también. ¡Muchas gracias! – sura2k

+0

No hay problema. Me alegro de poder ayudar :). – Corbin

+0

¡Gracias por indicarme el lugar correcto en el manual! – ptpaterson

3

Las claves únicas y principales de MySQL sirven para identificar las filas. Solo puede haber una clave principal en una tabla, pero una o más claves únicas. La clave es solo índice.

para más detalles se puede comprobar http://www.geeksww.com/tutorials/database_management_systems/mysql/tips_and_tricks/mysql_primary_key_vs_unique_key_constraints.php

para convertir MySQL MSSQL Intenta lo siguiente y http://gathadams.com/2008/02/07/convert-mysql-to-ms-sql-server/

+0

@Paul Bellora, tu explicación es más clara que la mía. Estupendo. – Wazan

+0

Bueno, acabo de citar los documentos, y no vi la segunda parte sobre la conversión. Creo que la respuesta de Corbin lo resume bien. –

23

sólo para añadir a las otras respuestas, la documentation da esta explicación:

  • KEY es normalmente sinónimo de INDEX. El atributo clave PRIMARY KEY puede también se puede especificar como KEY cuando se proporciona en una definición de columna.Este se implementó para compatibilidad con otros sistemas de bases de datos.

  • Un UNIQUE índice crea una restricción tal que todos los valores en el índice deben ser distintos. Se produce un error si intenta agregar una nueva fila con un valor de clave que coincida con una fila existente. Para todos los motores, un índice UNIQUE permite múltiples valores NULL para las columnas que pueden contener NULL.

  • A PRIMARY KEY es un índice único donde todas las columnas clave se deben definir como NOT NULL. Si no están explícitamente declarados como NOT NULL, MySQL los declara de manera implícita (y silenciosa). Una tabla puede tener solo un PRIMARY KEY. El nombre de PRIMARY KEY siempre es PRIMARY, por lo que no se puede utilizar como nombre para ningún otro tipo de índice.

+0

¡Gracias a todos! – sura2k

+0

¿Compatibilidad con otros sistemas de bases de datos? ¿Qué otro DBMS usa la palabra "KEY" para algo que no es una clave en absoluto (un índice)? Siempre había supuesto que era solo un poco de extrañeza de MySQL, y que los autores de MySQL en realidad no saben qué es una llave :) – sqlvogel

Cuestiones relacionadas