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 создает ограничение, так что все значения в индексе должны быть разными. Произошла ошибка, если вы попытаетесь добавить новую строку с помощью ключевое значение, которое соответствует существующей строке. Для всех двигателей, UNIQUEindex допускает несколько значений 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/