Подтвердить что ты не робот

Разница между уникальным ключом и первичными ключами

В книге я встретил следующий SQL:

CREATE TABLE 'categories'(
id SMALLINT NOT NULL AUTO INCREMENT,
category VARCHAR(30) NOT NULL,
PRIMARY KEY('id'),
UNIQUE KEY 'category'('category')
)ENGINE=MyISAM DEFAULT CHARSET = utf8;

Мне было интересно, есть ли причина, по которой мне понадобится ПЕРВИЧНЫЙ И УНИКАЛЬНЫЙ КЛЮЧ в одной таблице? Я думаю, в основе этого вопроса лежит вопрос: в чем разница между ключами PRIMARY и UNIQUE?

4b9b3361

Ответ 1

Реляционная модель говорит, что нет существенной разницы между одним ключом и другим. То есть, когда отношение имеет более одного ключа-кандидата, нет никаких теоретических причин для объявления того, что этот ключ является более важным, чем этот ключ. По сути, это означает, что нет никакой теоретической причины для идентификации одного ключа в качестве первичного ключа, а все остальные - как вторичные ключи. (Однако могут быть практические причины.)

Многие отношения имеют более одного ключа кандидата. Например, отношение штатов США может иметь такие данные.

State      Abbr      Postal Code
--
Alabama    Ala.      AL
Alaska     Alaska    AK
Arizona    Ariz.     AZ
...
Wyoming    Wyo.      WY

Ясно, что значения в каждом из этих трех столбцов уникальны - есть три ключа-кандидата.

Если вы собираетесь создавать таблицу в SQL для хранения этих значений, вы можете сделать это следующим образом.

CREATE TABLE states (
  state varchar(15) primary key,
  abbr varchar(10) not null unique,
  postal_code char(2) not null unique
);

И вы бы сделали что-то подобное, потому что SQL не имеет другого способа сказать: "Моя таблица имеет три отдельных ключа кандидата".

У меня не было особых причин для выбора "состояние" в качестве первичного ключа. Я мог бы так же легко выбрать "abbr" или "postal_code". Любой из этих трех столбцов также может использоваться в качестве цели для ссылки на внешний ключ.

И насколько это возможно, я мог бы построить таблицу так же.

CREATE TABLE states (
  state varchar(15) not null unique,
  abbr varchar(10) not null unique,
  postal_code char(2) not null unique
);

Ответ 2

Я удивлен, что никто не упоминал, что первичный ключ может быть указан как внешний ключ в других таблицах.

Также уникальное ограничение допускает значения NULL.

Ответ 3

Причина, по которой вам нужны два ограничения уникальности (один из которых является основным ключом), заключается в том, что вы используете Id в качестве суррогатного ключа. I.e., это произвольное значение, которое не имеет никакого значения по отношению к самим данным. Без уникального ключа (или в разговорной форме называемого "бизнес-ключ", то есть ключа, который пользователь будет распознавать как принудительно), пользователь может добавить два идентичных значения category с разными значениями Id. Поскольку пользователи никогда не должны видеть суррогатный ключ, они не знают, почему они видят дубликат, даже если база данных будет думать, что они разные.

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

В зависимости от того, с кем вы говорите, и как они читают спецификацию, уникальные ключи (что, кстати, является избыточным. "Ключ" по определению является уникальным) также не должны допускать нули. Тем не менее, можно также прочитать спецификации, указав, что уникальные ограничения, в отличие от ограничений первичного ключа, на самом деле должны допускать null (сколько допустимых значений разрешено также зависит от поставщика). Большинство продуктов, в том числе MySQL, допускают нули в уникальных ограничениях, тогда как ограничения первичного ключа этого не делают.

Ответ 4

Сходство

Оба индекса PRIMARY и UNIQUE создают ограничение, которое требует, чтобы все значения были разными (1).

Разница

Клавиша PRIMARY (неявно) определяет все ключевые столбцы как NOT NULL; кроме того, таблица может иметь только один первичный ключ.


(1) Каждое значение NULL считается отдельным.

Ответ 5

УНИКАЛЬНОЕ ограничение и ключ PRIMARY оба одинаковы и обеспечивают уникальную уникальность уникальности столбца, на котором они определены. Некоторые из них являются основными отличиями между основным ключом и уникальным ключом.

Основной ключ

Первичный ключ не может иметь значение NULL. Каждая таблица может иметь только один первичный ключ. Первичный ключ реализуется как индексы в таблице. По умолчанию этот индекс является кластеризованным индексом. Первичный ключ может быть связан с другой таблицей в качестве внешнего ключа. Мы можем автоматически генерировать идентификатор с помощью поля Auto Increment. Основной ключ поддерживает значение Auto Increment.

Уникальное ограничение

Уникальное ограничение может иметь значение NULL. Каждая таблица может иметь более одного уникального ограничения. Уникальная Constraint также реализуется как индексы на столе. По умолчанию этот индекс является некластеризованным индексом. Уникальная Constraint не может быть связана с другой таблицей как с внешним ключом. Уникальное ограничение не поддерживает значение Auto Increment.

Вы можете найти подробную информацию по адресу: http://www.oracleinformation.com/2014/04/difference-between-primary-key-and-unique-key.html