是否有可能创建一个没有主键但有两个外键的表,其中外键对总是不同的?
例如,一个
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
或者我是否必须使用自动增量或其他方式创建未使用的主键字段?
数据库是oracle。
您需要一个复合主键。
像这样:
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)
);
您可以在两列上创建主键:在设计器视图中单击两列 > 单击 pk
或者,您可以在 2 列上添加唯一约束:
ALTER TABLE [dbo].[RepresentativeData]
add CONSTRAINT [UK_Representative_repRecID_AppID] unique (repRecID,AppId)
go
我更喜欢复合主键,因为它强制该值确实存在于其他表中。
是的,它被称为复合主键
复合主键对此没有任何问题,但在大多数情况下创建单个主键列可能更容易。 除非您有特定的硬件限制,否则 pk col 可能只会提高性能并易于维护。
不要忘记考虑您可能会遇到与您的模型不太相符的情况。 例如,您可能拥有已知存在的库存,但目前不知道它位于哪个仓库、或在运输途中、或尚未分配等。 您要么需要创建业务规则以将其适合您的复合主键,要么使用主键列。
如果您不执行任何需要它的查询,则您不需要需要主键。 不过,这使得明确删除记录变得有点困难。 如果 Oracle 允许,您可能希望对 item_id、warehouse_id 设置唯一约束。
您不必创建“未使用”的主键字段,但它通常会让生活变得更简单。 (正如 Paul T 指出的,您必须指定这两个字段才能删除一行)。
我经常将此类列命名为“PK”,以使其有限的效用显而易见。
此外,请记住,外键的用途与主键不同。所以你不能用两个外键替换一个主键。