Каково различие между двумя DDLs в MySQL?

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));

Есть ли какое-либо функциональное различие?

1
задан user198729 21 February 2010 в 11:41
поделиться

4 ответа

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

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

0
ответ дан 3 September 2019 в 01:11
поделиться

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

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

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

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

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

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

1
ответ дан 3 September 2019 в 01:11
поделиться

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

1
ответ дан 3 September 2019 в 01:11
поделиться

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

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

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

0
ответ дан 3 September 2019 в 01:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: