【问题标题】:Two foreign keys instead of primary两个外键而不是主键
【发布时间】:2010-09-17 13:03:24
【问题描述】:

我想知道,是否有可能创建一个没有主键但有两个外键的表,其中外键对总是不同的? 例如,STOCK 表与 item_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。

谢谢!

【问题讨论】:

    标签: database oracle foreign-keys primary-key


    【解决方案1】:

    你想要一个compound primary key

    【讨论】:

      【解决方案2】:

      是的,它被称为复合主键

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

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

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

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

          【讨论】:

            【解决方案5】:

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

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

            【讨论】:

              【解决方案6】:

              正如大家所说,您可以从 2 列创建一个主节点。您不必创建人为的自动增量列。

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

              【讨论】:

                【解决方案7】:

                像这样:

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

                【讨论】:

                  【解决方案8】:

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

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

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2016-11-18
                    相关资源
                    最近更新 更多