0

テーブルの 1 つに、3 つの外部キー (order_no、product_code、および product_size) で構成される複合キーがあります。

Product_size が主キーであるテーブルでは、Product_size と product_code で構成される複合キーが必要です。これらを複合キーにすると、product_size だけでは PK にならないため、3 つの外部キーから構成される複合キーの作成で参照できません。

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(および異なる)を持つ 2 つの行があるとしますproduct_code。ここで、これらの行の 1 つ (他の行ではない) が削除されたとします。

  • orderlineそれを参照する行があるため、それを制限する必要がありますか?
  • product_stockそれとも、そのorderline参照している他の行がまだ存在するため、許可する必要がありますか?

(同様の問題は、ON DELETE CASCADE / SET NULL、および PK を UPDATE する場合にも存在します。)

このようなあいまいさを避けるために、親行を一意に識別できない限り、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 に答える