Я много писал на эту тему: если вы прочитали что-нибудь из моих, ясно, что я, вероятно, имел в виду именно Jet a.k.a. MS Access.
В Jet таблицы физически упорядочены на ПЕРВИЧНОМ КЛЮЧЕ с использованием необслуживаемого кластеризованного индекса (кластеризован на компактном). Если в таблице нет PK, но ключи-кандидаты определены с использованием ограничений UNIQUE для столбцов NOT NULL, то механизм выберет один для кластеризованного индекса (если в вашей таблице нет кластеризованного индекса, то он называется кучей, возможно, не таблицей вообще !) Как двигатель выбирает подходящий ключ? Может ли он выбрать тот, который включает обнуляемые столбцы? Я действительно не знаю. Дело в том, что в Jet единственным явным способом указания кластерного индекса для движка является использование PRIMARY KEY. Конечно, есть и другие варианты использования PK в Jet, например, он будет использоваться в качестве ключа, если он пропущен в объявлении FOREIGN KEY в SQL DDL, но, опять же, почему бы не быть явным.
Проблема с Jet заключается в том, что большинство людей, которые создают таблицы, не знают о кластерных индексах или не заботятся о них. Фактически, большинство пользователей (я держу пари) помещает столбец автоинкремента автоинкремента в каждую таблицу и определяет PRIMARY KEY исключительно для этого столбца, не устанавливая никаких уникальных ограничений на естественный ключ и ключи-кандидаты (может ли столбец автоинкремента фактически рассматриваться как ключ, не раскрывая его конечным пользователям, сам по себе является еще одной дискуссией). Я не буду вдаваться в подробности о кластеризованных индексах здесь, но достаточно сказать, что ИМО - единственный столбец автоинкремента - редко является идеальным выбором.
Независимо от того, какой у вас движок SQL, выбор PRIMARY KEY произвольный и зависит от движка. Обычно движок придает особое значение PK, поэтому вы должны выяснить, что это такое, и использовать его в своих интересах. Я призываю людей использовать ограничения NOT NULL UNIQUE в надежде, что они будут уделять больше внимания всем ключам-кандидатам, особенно когда они решили использовать столбцы «autonumber», которые (не должны) иметь значение в модели данных. Но я бы предпочел, чтобы народ выбрал один хорошо продуманный ключ и использовал ПЕРВИЧНЫЙ КЛЮЧ, а не ставил его в колонку автоинкремента по привычке.
Должны ли все таблицы иметь PK? Я говорю «да», потому что если вы поступите иначе, по крайней мере, вы упустите небольшое преимущество, которое дает движок PK, и в худшем случае у вас нет целостности данных.
КСТАТИ Крис OC делает хорошее замечание о временных таблицах, которые требуют последовательных первичных ключей (нижний регистр), которые не могут быть реализованы с помощью простых ограничений PRIMARY KEY (ключевые слова SQL в верхнем регистре).