Есть ли функциональная разница?
В общем, разница между ограничением primary key
и unique
заключается в том, что вы можете создать последнее для столбцов, допускающих значение NULL. То есть вы можете создать первичный ключ на columsn, который явно не объявлен NOT NULL
, но он автоматически станет не обнуляемым в результате добавления первичного ключа. Кроме того, вы можете иметь только один первичный ключ, но множество уникальных ограничений.
Теперь, в вашем примере кода, оба столбца в любом случае равны NOT NULL
, поэтому функционально не будет никакой разницы между ограничением primary key
и unique
. Но это очевидное отсутствие различий относится только к логическим, реляционным свойствам таблицы. Все еще могут быть различия на уровне механизма хранения.
Например, механизм хранения innodb использует кластерные индексы: данные таблицы хранятся в конечных узлах индекса, созданного для первичного ключа. Поэтому, если у вас есть таблица innodb без первичного ключа, innodb все равно создаст ее под прикрытием, и ваш уникальный индекс будет указывать на значения в первичном ключе. Другие механизмы, такие как механизм кластера NDB, также автоматически создают первичный ключ, если вы не определите его явно, и в этом случае любые вторичные индексы, такие как ваш уникальный индекс, будут указывать на входы в первичном ключе. В обоих случаях эти вторичные индексы, как правило, будут работать медленнее, чем тогда, когда они изначально были бы определены как первичный ключ.
В MySQL есть еще одно отличие, касающееся первичного ключа и уникальных ограничений. Если вы хотите создать столбец auto_increment
, тогда этот столбец должен быть частью первичного ключа (и обычно первичный ключ состоит только из столбца auto_increment
)
Помимо этих технических различий, существует также вопрос соглашения. Хорошей практикой всегда является определение первичного ключа - в основном вы говорите: «Это канонический способ определения строки в этой таблице». Если вы пропустите это, это вызовет путаницу, так как может показаться, что вы забыли ее определить.