MySQL - значение "PRIMARY KEY", "UNIQUE KEY" и "KEY" при совместном использовании при создании таблицы
Может ли кто-нибудь объяснить цель PRIMARY KEY
, UNIQUE KEY
и KEY
, если они будут объединены в один оператор CREATE TABLE
в 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 ;
Как преобразовать этот запрос в MySQL?
Ответы
Ответ 1
Ключ - это обычный индекс. Путем упрощения следует подумать об этом, как о карточном каталоге в библиотеке. Он указывает MySQL в правильном направлении.
Уникальный ключ также используется для улучшения скорости поиска, но имеет ограничение на то, что не может быть дублированных элементов (нет двух x и y, где x не является y и x == y).
Руководство объясняет это следующим образом:
УНИКАЛЬНЫЙ индекс создает ограничение, так что все значения в индексе должны быть разными. Произошла ошибка, если вы попытаетесь добавить новую строку с помощью ключевое значение, которое соответствует существующей строке. Это ограничение не применяется к значениям NULL, за исключением механизма хранения BDB. Для других двигателей Индекс UNIQUE допускает множественные значения NULL для столбцов, которые могут содержать НОЛЬ. Если вы укажете префиксное значение для столбца в индексе UNIQUE, значения столбца должны быть уникальными в пределах префикса.
Первичный ключ - это "специальный" уникальный ключ. Это в основном уникальный ключ, за исключением того, что он когда-то идентифицировал.
В руководстве объясняется, как используются индексы в целом: здесь.
В 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);
Изменить: приведенный выше код проверен на правильность; однако я подозреваю, что для этого есть гораздо лучший синтаксис. Прошло некоторое время с тех пор, как я использовал SQL-сервер, и, по-видимому, я совсем забыл:).
Ответ 2
Чтобы добавить к другим ответам, документация дает следующее объяснение:
-
KEY
обычно является синонимом INDEX
. Ключевой атрибут PRIMARY KEY
может также указывается как только KEY
, если задано в определении столбца. Эта была реализована для совместимости с другими системами баз данных.
-
A UNIQUE
index создает ограничение, так что все значения в индексе должны быть разными. Произошла ошибка, если вы попытаетесь добавить новую строку с помощью ключевое значение, которое соответствует существующей строке. Для всех двигателей, UNIQUE
index допускает несколько значений NULL
для столбцов, которые могут содержать NULL
.
-
A PRIMARY KEY
- уникальный индекс, где должны быть определены все ключевые столбцы как NOT NULL
. Если они явно не объявлены как NOT NULL
, MySQL объявляет их так неявно (и молча). Таблица может содержать только одну PRIMARY KEY
. Имя a PRIMARY KEY
всегда PRIMARY
, что, таким образом, не может использоваться как имя для любого другого типа индекса.
Ответ 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/