2008-10-16 4 views
9

Мне было интересно, есть ли возможность создать таблицу без первичного ключа, но с двумя внешними ключами, где пары внешних ключей всегда разные? Например, таблица 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 

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

Спасибо!

ответ

3

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

0

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

4

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

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

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

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

+0

Компонентный первичный ключ не применяет ограничения внешнего ключа ... – 2012-11-19 13:47:32

0

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

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

0

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

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

6

Как это:

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) 
); 
1

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

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

Смежные вопросы