两个外键而不是主键

时间:2008-10-16 13:55:42

标签: database oracle foreign-keys primary-key

我想知道,有没有可能创建一个没有主键的表,但有两个外键,外键对总是不同? 例如,STOCKitem_idwarehouse_id作为来自ITEMSWAREHOUSES表的外键。所以同样的物品可以在不同的仓库中。表格的视图:

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

或者我是否必须使用自动增量创建未使用的主键字段? 数据库是oracle。

谢谢!

8 个答案:

答案 0 :(得分:28)

您需要compound primary key

答案 1 :(得分: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)
);

答案 2 :(得分:4)

您可以在两列上创建主键:在设计器视图中单击两列>点击pk

或者,您可以在2列上添加唯一约束:

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

我更喜欢复合主键,因为它强制该值确实存在于其他表中。

答案 3 :(得分:3)

是的,它被称为复合主键

答案 4 :(得分:1)

复合主键对此没有任何问题,但在大多数情况下创建单个主键列可能更容易。除非您有特定的硬件限制,否则pk col可能只会改善性能并且易于维护。

不要忘记您可能会遇到可能不适合您模型的情况。例如,您可能拥有您知道存在的库存但目前不知道它在哪个仓库,或者在运输中或尚未分配的库存或其他什么。您需要创建业务规则以将其纳入复合主键或改为使用主键列。

答案 5 :(得分:0)

如果您没有进行任何需要它的查询,则不需要需要主键。不过,这使得删除记录变得有点困难。如果Oracle允许,您可能希望在item_id,warehouse_id上​​放置一个唯一约束。

答案 6 :(得分:0)

你没有拥有来创建一个“未使用的”主键字段,但它通常会让生活更简单。 (正如Paul T指出的那样,你必须指定两个字段来删除一行)。

我经常将这些专栏命名为“PK”,以使其有限的实用性显而易见。

答案 7 :(得分:0)

就像大家所说的那样,你可以从2列创建一个主要版本。您不必创建人工自动增量列。

另外,请记住,外键与主键的用途不同。所以你不能用2个外键替换主键。