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));
Есть ли какое-либо функциональное различие?
Посмотрите на Разница между уникальным индексом и первичным ключом в MySQL
Индекс UNIQUE создает ограничение. такое, что все значения в индексе должны быть разными. Ошибка возникает, если вы попытаетесь добавить новую строку со значением ключа. которое совпадает с существующим. Этот ограничение не применяется к NULL за исключением хранилища BDB движка. Для других механизмов индекс UNIQUE индекс UNIQUE допускает несколько значений NULL для столбцов, которые могут содержать NULL
Есть ли функциональная разница?
в целом разница между первичным ключом
и уникальным
ограничение в том, что вы можете создать последний в столбцах, допускающих значение NULL. То есть вы можете создать первичный ключ в columsn, который явно не объявлен NOT NULL
, но они автоматически станут не допускающими значения NULL в результате добавления первичного ключа. Кроме того, у вас может быть только один первичный ключ, но много уникальных ограничений.
Теперь в вашем примере кода оба столбца NOT NULL
в любом случае, поэтому функционально не будет никакой разницы между первичным ключом
и уникальным
ограничение. Но это очевидное отсутствие различий применимо только к логическим, относительным свойствам таблицы. На уровне механизма хранения все еще могут быть различия.
Например, механизм хранения innodb использует кластерные индексы: данные таблицы хранятся в конечных узлах индекса, созданного для первичного ключа. Поэтому, если у вас есть таблица innodb без первичного ключа, innodb все равно создаст ее под обложками, и ваш уникальный индекс будет указывать на enties в первичном ключе. Другие механизмы, такие как механизм кластера NDB, также автоматически создают первичный ключ, если вы не определяете его явно, и в этом случае любые вторичные индексы, такие как ваш уникальный индекс, будут указывать на входы в первичном ключе. В обоих случаях эти вторичные индексы обычно работают медленнее, чем когда они изначально были определены как первичный ключ.
В MySQL есть еще одно различие, связанное с ограничениями первичного ключа и уникальности. Если вы хотите создать столбец auto_increment
, этот столбец должен быть частью первичного ключа (и обычно первичный ключ будет состоять только из столбца auto_increment
)
Помимо этих технических различий, необходимо учитывать еще и вопрос условности. Всегда считается хорошей практикой определять первичный ключ - в основном вы говорите: «Это канонический способ идентификации строки в этой таблице». Если вы его не укажете, это вызовет путаницу, поскольку может показаться, что вы забыли его определить.
Да, у вас может быть только один первичный ключ, но вы можете иметь столько уникальных индексов, сколько захотите.
Первичные ключи похожи на уникальные индексы, за исключением:
Поскольку они не могут иметь NULL, первичный ключ ДОЛЖЕН однозначно идентифицировать строку.