Два внешних ключа вместо первичных - PullRequest
9 голосов
/ 16 октября 2008

Мне было интересно, есть ли возможность создать таблицу без первичного ключа, но с двумя внешними ключами, где пары внешних ключей всегда различны? Например, таблица STOCK с item_id и warehouse_id в качестве внешних ключей из таблиц ITEMS и WAREHOUSES. Так же товар может находиться на разных складах. Вид таблицы:

item_id   warehouse_id   quantity
10        200            1000
10        201            3000
10        202            10000
11        200            7000
11        202            2000
12        203            5000

Или мне нужно создать неиспользуемое поле первичного ключа с автоматическим приращением или что-то в этом роде? База данных оракула. ​​

Спасибо!

Ответы [ 8 ]

28 голосов
/ 16 октября 2008
6 голосов
/ 16 октября 2008

Как это:

create table stock
( item_id      references items(item_id)
, warehouse_id references warehouses(warehouse_id)
, quantity     number(12,2) not null
, constraint stock_pk primary key (item_id, warehouse_id)
);
4 голосов
/ 16 октября 2008

Вы можете создать первичный ключ для двух столбцов: щелкните по обоим столбцам в представлении конструктора> щелкните по pk

Или вы можете добавить уникальное ограничение на 2 столбца:

ALTER TABLE [dbo].[RepresentativeData] 
add CONSTRAINT [UK_Representative_repRecID_AppID] unique (repRecID,AppId)
go

Я предпочитаю составной первичный ключ, потому что он обеспечивает существование значения в других таблицах.

3 голосов
/ 16 октября 2008

да это называется составной первичный ключ

1 голос
/ 16 октября 2008

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

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

0 голосов
/ 16 октября 2008

Как и все говорили, вы можете создать первичный из 2 столбцов. Вам не нужно создавать искусственный столбец автоинкремента.

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

0 голосов
/ 16 октября 2008

У вас нет для создания «неиспользуемого» поля первичного ключа, но это часто упрощает жизнь. (Как отмечает Пол Т, вам нужно указать оба поля, чтобы удалить строку).

Я часто называю такие столбцы "PK", чтобы сделать их ограниченную полезность очевидной.

0 голосов
/ 16 октября 2008

Если вы не выполняете какой-либо запрос, который нуждается в нем, не требуется первичный ключ. Тем не менее, это затрудняет однозначное удаление записи. Возможно, вы захотите установить уникальное ограничение для item_id, warehouse_id, если Oracle это разрешит.

...