两个外键代替主键

9

我在想,是否有可能创建一张没有主键但有两个外键的表,其中外键对总是不同呢?例如,一个 STOCK 表,它有从 ITEMSWAREHOUSES 表中获取的 item_idwarehouse_id 作为外键。因此,相同的物品可以存在于不同的仓库中。该表的视图:

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个回答

28

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

4

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

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

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

我更喜欢使用复合主键,因为它可以强制确保该值在其他表中存在。


3
是的,它被称为复合主键。

1

对于这个问题,使用复合主键没有任何问题,但在大多数情况下,创建单个主键列可能更容易。除非您有特定的硬件限制,否则主键列可能只会提高性能和易于维护。

不要忘记考虑到您可能会遇到一些无法完全符合您模型的情况。例如,您可能知道某些库存存在,但目前不知道它在哪个仓库中,或者正在运输中,还没有分配等等。您需要将其纳入复合主键中,或者使用主键列来解决这个问题。


0

如果您没有进行任何需要主键的查询,那么您就不必须使用主键。但这会稍微增加删除记录时的难度。如果Oracle允许,您可以在item_id、warehouse_id上放置唯一约束。


0

你不必创建一个“未使用”的主键字段,但这通常会使生活更简单。(正如Paul T所指出的那样,您必须指定两个字段才能删除一行)。

我经常将这些列命名为“PK”,以明确它们的有限用途。


0

就像其他人所说的那样,你可以从2个列创建一个主键。你不必创建一个人工自增列。

此外,请记住,外键的作用不同于主键。因此,你不能用2个外键替换主键。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接