[SQL] PRIMARY KEY vs. UNIQUE CONSTRAINT

sakura

create table test_1
(
id number PRIMARY KEY,
value varchar2(100)
)

vs.
create table test_2
(
id number NOT NULL,
value varchar2(100)
)
CREATE UNIQUE INDEX test_i_id ON test_2 (id)

Собственно, в чем разница между primary key и not null + unique constraint (БД Oracle)?

sakura

И что из них предпочтительнее использовать?

kruzer25

1) Афаик UNIQUE и INDEX - разные вещи, и UNIQUE не включает в себя INDEX... по крайней мере, в Postres-е.
2) PRIMARY означает, что это - идентификатор строк. А UNIQUE+INDEX - что по этому полю будем искать, и что его значения не повторяются, логически это совсем разные вещи, так что для идентификатора PRIMARY - тру.
3) В MySQL для PRIMARY можно сделать auto_increment (в постгресе вроде как последовательность можно вообще какую угодно и на что угодно сделать, но я могу и ошибаться)

sakura

UNIQUE и INDEX - разные вещи, и UNIQUE не включает в себя INDEX
Т.е. ты хочешь сказать, что нельзя написать
CREATE UNIQUE INDEX test_i_id ON test_2 (id)
? В oracle можно.
Мой вопрос собстенно был в том, что когда поле является PRIMARY KEY, то оно должно быть уникальным и не быть NULL + по нему можно быстро найти нужную строку в таблице => это поле должно быть еще и проиндексированно (я так думаю).
Собственно вопрос про равнозначность PRIMARY KEY и UNIQUE+NOT NULL.

Dasar

primary key - помечает для всего мира (в том числе и для автоматизированных утилит что именно по этому полю происходит идентификация записи

eduard615

1) Афаик UNIQUE и INDEX - разные вещи, и UNIQUE не включает в себя INDEX... по крайней мере, в Postres-е.
Вранье, как раз включает. При создании unique поля создается неявный индекс.
В постгре разница между primary и not null + unique + index только в том, что в первом случае поле добавляется в список ключей и при foreign key на эту таблицу постгря попытается сама понять, по какому полю искать.
вся остальная реализвация идентична.

kruzer25

Т.е. ты хочешь сказать, что нельзя написать
Я хочу сказать, что если ты сделаешь поле UNIQUE, то поск по нему всё равно будет осуществляться полным перебором, так что надо делать поле и UNIQUE, и INDEX-ом.

kruzer25

Вранье, как раз включает. При создании unique поля создается неявный индекс
Мы тоже так думали, пока анализатор запросов не спросили. И не увидели, что если поле unique - идёт полный перебор, а еслидополнительно явно сделать его index-ом - поиск идёт по дереву.

mbolik1

Собственно, в чем разница между primary key и not null + unique constraint (БД Oracle)?

Судя по этому:
A primary key constraint combines a NOT NULL and unique constraint in one declaration

вообще ничем.

pitrik2

Мы тоже так думали, пока анализатор запросов не спросили. И не увидели, что если поле unique - идёт полный перебор, а еслидополнительно явно сделать его index-ом - поиск идёт по дереву.
доркументация постгреса с тобой не согласна
there's no need to manually create indexes on unique columns; doing so would just duplicate the automatically-created index.

eduard615

Мы тоже так думали, пока анализатор запросов не спросили. И не увидели, что если поле unique - идёт полный перебор, а еслидополнительно явно сделать его index-ом - поиск идёт по дереву.
Как идет поиск — через seq scan или index scan — зависит от кучи факторов: как запрос составлен, сколько записей в таблице, когда был сделан вакуум, какие цены на сканы, как geqo настроен и т.д.
индекс он создает и когда надо использует.

kruzer25

Таблица вида Id PRIMARY KEY, Field UNIQUE, с тысячей записей. SELECT * FROM table WHERE Field = 1234 - полный скан. Если тут же сделать CREATE INDEX - поиск по индексу.

sakura

A primary key constraint combines a NOT NULL and unique constraint in one declaration
Спасибо, !
Оставить комментарий
Имя или ник:
Комментарий: