В чем разница между двумя DDL в MySQL? - PullRequest
1 голос
/ 21 февраля 2010
create table categories(a integer unsigned NOT NULL,b integer unsigned NOT NULL,primary key(a,b));

И

create table categories(a integer unsigned NOT NULL,b integer unsigned NOT NULL,unique (a,b));

Есть ли функциональная разница?

Ответы [ 4 ]

1 голос
/ 21 февраля 2010

Есть ли функциональная разница?

В общем, разница между ограничением primary key и unique заключается в том, что вы можете создать последнее для столбцов, допускающих значение NULL. То есть вы можете создать первичный ключ на columsn, который явно не объявлен NOT NULL, но он автоматически станет не обнуляемым в результате добавления первичного ключа. Кроме того, вы можете иметь только один первичный ключ, но множество уникальных ограничений.

Теперь, в вашем примере кода, оба столбца в любом случае равны NOT NULL, поэтому функционально не будет никакой разницы между ограничением primary key и unique. Но это очевидное отсутствие различий относится только к логическим, реляционным свойствам таблицы. Все еще могут быть различия на уровне механизма хранения.

Например, механизм хранения innodb использует кластерные индексы: данные таблицы хранятся в конечных узлах индекса, созданного для первичного ключа. Поэтому, если у вас есть таблица innodb без первичного ключа, innodb все равно создаст ее под прикрытием, и ваш уникальный индекс будет указывать на значения в первичном ключе. Другие механизмы, такие как механизм кластера NDB, также автоматически создают первичный ключ, если вы не определите его явно, и в этом случае любые вторичные индексы, такие как ваш уникальный индекс, будут указывать на входы в первичном ключе. В обоих случаях эти вторичные индексы, как правило, будут работать медленнее, чем тогда, когда они изначально были бы определены как первичный ключ.

В MySQL есть еще одно отличие, касающееся первичного ключа и уникальных ограничений. Если вы хотите создать столбец auto_increment, тогда этот столбец должен быть частью первичного ключа (и обычно первичный ключ состоит только из столбца auto_increment)

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

1 голос
/ 21 февраля 2010

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

0 голосов
/ 21 февраля 2010

Первичные ключи похожи на уникальные индексы, за исключением:

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

Поскольку они не могут иметь значения NULL, первичный ключ ДОЛЖЕН однозначно идентифицировать строку.

0 голосов
/ 21 февраля 2010

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

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

...