2012-06-06 3 views
56

Может кто-нибудь объяснить о цели PRIMARY KEY, UNIQUE KEY и KEY, если они выразились в едином CREATE TABLE заявление в MySQL?MySQL - Значение «PRIMARY KEY», «UNIQUE KEY» и «KEY», когда используются вместе при создании таблицы

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 ; 

Как преобразовать этот запрос в MySQL?

+3

связаны: [? KEY ключевое слово MYSQL в] (http://stackoverflow.com/q/924265/697449) В основном 'KEY' является синонимом' INDEX'. –

ответ

80

Ключ просто нормальный индекс. Путем упрощения следует подумать об этом, как о карточном каталоге в библиотеке. Он указывает MySQL в правильном направлении.

Уникальный ключ также используется для улучшения скорости поиска, но имеет ограничение на то, что не может быть дублированных элементов (нет двух x и y, где x не равно y и x == y).

manual объясняет это следующим образом:

УНИКАЛЬНЫЙ индекс создает ограничение такое, что все значения в индексе должны быть различны. Произошла ошибка, если вы попытаетесь добавить новую строку с ключом , который соответствует существующей строке. Это ограничение не применяется к значениям NULL, за исключением механизма хранения BDB. Для других двигателей индекс UNIQUE допускает множество значений NULL для столбцов, которые могут содержать NULL. Если вы укажете префиксное значение для столбца в индексе UNIQUE, значения столбца должны быть уникальными в префиксе.

Первичный ключ - это «специальный» уникальный ключ. В основном это уникальный ключ, за исключением того, что он используется для определения чего-то.

В руководстве объясняется, как используются индексы в целом: here.

В MSSQL концепции схожи. Существуют индексы, уникальные ограничения и первичные ключи.

непроверенная, но я считаю, что MSSQL эквивалент:

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: код выше проверяется, чтобы быть правильным; однако я подозреваю, что для этого есть гораздо лучший синтаксис. Прошло некоторое время с тех пор, как я использовал SQL-сервер, и, видимо, я совсем забыл :).

+1

Отличное объяснение! Код тоже работает. Большое спасибо! – sura2k

+0

Нет проблем. Рад, что смог помочь :). – Corbin

+0

Благодарим за то, что вы указали мне правильное место в руководстве! – ptpaterson

3

Уникальные и первичные ключи MySQL служат для идентификации строк. В таблице может быть только один основной ключ, но один или несколько уникальных ключей. Ключ - это просто индекс.

для получения более подробной информации вы можете проверить http://www.geeksww.com/tutorials/database_management_systems/mysql/tips_and_tricks/mysql_primary_key_vs_unique_key_constraints.php

конвертировать MySQL в MSSQL попробовать это и увидеть http://gathadams.com/2008/02/07/convert-mysql-to-ms-sql-server/

+0

@Paul Bellora, ваше объяснение более ясное, чем мое. Отлично. – Wazan

+0

Ну, я просто процитировал документы, и я не видел вторую часть о конвертации. Я думаю, что ответ Корбина подводит итог. –

23

Просто добавить другие ответы, то documentation дает такое объяснение:

  • KEY обычно является синонимом INDEX. Ключевым атрибутом PRIMARY KEY может быть также указывается как KEY, если задано в определении столбца.Этот был реализован для совместимости с другими системами баз данных.

  • A UNIQUE индекс создает ограничение, так что все значения в индексе должны быть различными. Произошла ошибка, если вы попытаетесь добавить новую строку с ключом , который соответствует существующей строке. Для всех двигателей индекс UNIQUE допускает множество значений NULL для столбцов, которые могут содержать NULL.

  • A PRIMARY KEY - уникальный индекс, где все ключевые столбцы должны быть определены как NOT NULL. Если они явно не объявлены как NOT NULL, MySQL объявляет их так неявно (и молча). Таблица может содержать только один PRIMARY KEY. Имя PRIMARY KEY всегда PRIMARY, поэтому не может использоваться как имя для любого другого индекса.

+0

Спасибо всем! – sura2k

+0

Совместимость с другими системами баз данных? Что другая СУБД использует слово «КЛЮЧ» для чего-то, что не является ключом (индекс)? Я всегда считал, что это всего лишь немного странность в MySQL, и что авторы MySQL на самом деле не знают, что такое ключ :) – sqlvogel

Смежные вопросы