9

我想知道,是否有可能创建一个没有主键但有两个外键的表,其中外键对总是不同的?例如,一个STOCK表,其中item_idandwarehouse_id作为外键来自ITEMSandWAREHOUSES表。所以同一个项目可以在不同的仓库。表视图:

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

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

谢谢!

4

8 回答 8

28

你想要一个复合主键

于 2008-10-16T13:57:15.747 回答
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)
);
于 2008-10-16T14:09:37.517 回答
4

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

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

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

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

于 2008-10-16T14:00:19.393 回答
3

是的,它被称为复合主键

于 2008-10-16T13:58:09.473 回答
1

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

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

于 2008-10-16T14:25:13.490 回答
0

如果您不进行任何需要它的查询,则不需要主键。但是,这使得明确删除记录变得有点困难。如果 Oracle 允许,您可能希望对 item_id,warehouse_id 设置唯一约束。

于 2008-10-16T13:58:19.333 回答
0

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

我经常将此类列命名为“PK”,以使其有限的效用显而易见。

于 2008-10-16T14:02:32.447 回答
0

就像每个人都说的那样,您可以从 2 列创建一个主节点。您不必创建人工自动增量列。

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

于 2008-10-16T14:04:03.440 回答