0

我的一张表有一个由三个外键(order_no、product_code 和 product_size)组成的复合键。

在 Product_size 是主键的表中,我希望有一个由 Product_size 和 product_code 组成的复合键。如果我确实将它们设为复合键,单独的 product_size 将不是 PK,因此我无法在创建由三个外键组成的复合键时引用它。

create table product_stock
(
Product_Code varchar2(6) constraint productcode_fk references product(Product_Code),
Product_Size char(1) constraint size_chk check (Product_Size in   
('L', 'l', 'M', 'm', 'S', 's' )),
Product_Unitprice number(7,2) not null,
Stock_Quantity number(4) not null,
constraint prodstock_comp primary key (product_code,product_size)
);


create table orderline
(
Order_No number(4) constraint orderno_fk references order_detail(Order_No),
Product_Code varchar2(6) constraint productcode2_fk references product(Product_Code),
Product_Size char(1) constraint productsize_fk references product_stock(product_size),
Product_Quantity number(4) not null,
constraint orderline_comp primary key (Order_No,Product_Code, Product_Size)
);

这甚至可能吗?

4

2 回答 2

3

单独的 product_size 不会是 PK,所以我不能引用它

想象一下,表中有两行product_stock相同product_size(和不同product_code)。现在想象这些行之一(但不是另一行)被删除。

  • 是否应该因为有orderline引用它的行而受到限制?
  • 还是应该允许它,因为仍然存在另一product_stock行,该orderline引用?

(在 ON DELETE CASCADE / SET NULL 以及更新 PK 时也存在类似问题。)

为避免此类歧义,DBMS 不会让您创建外键,除非您可以唯一标识父行,这意味着您必须在 FK 的 REFERENCES 子句之后使用整个键。


话虽如此,您可以同时创建...

FOREIGN KEY (product_code)
REFERENCES product (product_code)

...和...

FOREIGN KEY (product_code, product_size)
REFERENCES product_stock (product_code, product_size)

虽然,如果你有后者,前者可能是多余的。

实际上,(因为您已经拥有 FK product_stock -> product),拥有两个 FK 会创建“菱形”依赖项。顺便说一句,一些 DMBS 对菱形 FK 有限制(MS SQL Server 不支持对其进行级联引用操作)。

于 2012-12-07T18:57:56.917 回答
1

取决于您的特定 DBMS,但您可以使用单独的约束子句在多个列上定义外键,如下所示:

create table orderline (
  Order_No number(4) constraint orderno_fk references order_detail(Order_No),
  Product_Code varchar2(6) constraint productcode2_fk references product(Product_Code),
  Product_Size char(1) constraint productsize_fk references product_stock(product_size),
  Product_Quantity number(4) not null,
  constraint orderline_comp primary key (Order_No,Product_Code, Product_Size),
  constraint fk_product_stock foreign key (product_code, product_size) references product_stock (product_code, product_size)
);
于 2012-12-07T18:19:54.540 回答