【问题标题】:Why can't I add a foreign key that references from a composite key from the parent table?为什么我不能添加从父表中的复合键引用的外键?
【发布时间】:2020-07-08 13:54:03
【问题描述】:

我有一个表,它有两个键,主键和外键同时也从另一个表引用。

CREATE TABLE public."restaurantProduct"
(
  "restaurantId" bigint NOT NULL,
  "productId" bigint NOT NULL,
  CONSTRAINT "restaurantProduct_pkey" PRIMARY KEY ("restaurantId", "productId"),
  CONSTRAINT "restaurantProduct_productId_fkey" FOREIGN KEY ("productId")
      REFERENCES public.products ("productId") MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE RESTRICT,
  CONSTRAINT "restaurantProduct_restaurantId_fkey" FOREIGN KEY ("restaurantId")
      REFERENCES public.restaurant ("restaurantId") MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE RESTRICT
)

现在我想创建另一个名为 custOrders 的表并使用 restaurantProduct.restaurantId 作为外键,但它给了我一个错误 错误:没有唯一约束匹配给定键的引用 talbe "restaurantProduct" 当我已经将restaurantProduct.restaurantId 分配为主键时。也无法将UNIQUE 添加到restaurantProduct.restaurantId,因为餐厅可以有多种产品。我可以重新设计数据库,但我只是想知道是否有任何方法可以单独使用这个设计?

【问题讨论】:

  • 外键必须包含引用主键中的所有列。
  • @a_horse_with_no_name 所以你的意思是我必须将restaurantProduct.productId 作为我的custOrders 表的外键包含在内?

标签: postgresql postgresql-9.5


【解决方案1】:

我已经指定了restaurantProduct.restaurantId 作为主键

不,该列不是主键。它是复合主键的一部分。您的restaurantProduct 表中可以有多行具有相同的restaurntId,只要它们具有不同的productIds。

我想创建另一个名为custOrders 的表并使用restaurantProduct.restaurantId 作为外键

正如错误消息已经指出的那样,您不能这样做。但是,您可以将其引用为 restaurant.restaurantId

如果你真的想要一个订单引用restaurantProduct,你需要两列——一列用于restaurantId,另一列用于productId,然后有一个复合外键引用 restaurantProduct 中的两列

【讨论】:

    猜你喜欢
    • 2021-06-09
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-13
    • 1970-01-01
    • 2023-02-25
    • 1970-01-01
    相关资源
    最近更新 更多