5

以前は主に MyISAM テーブルを使用していましたが、これは外部キーをサポートしていません。スタックオーバーフローを見ると、外部キーが実際に何をしているのかについての簡潔で適切な説明が見つかりませんでした。私は主に、次のようなスキーマを持つ結合テーブルに興味があります。

customers
id category_id

products
id category_id 

categories
id

customerproducts
customer_id product_id

customerproducts に外部キーがある場合、有効な顧客と有効な製品のみがそのテーブルに入ることが保証されますが、電話カテゴリの製品を、コピー機のみに関心がある顧客としてマークされた顧客に追加しようとするとどうなりますか? これにより、外部キー制約が違反されますか?

4

1 に答える 1

1

私は主に、次のようなスキーマを持つ結合テーブルに興味があります。

そのようなスキーマはありません。関心のある事実を表しているわけではありません。SQL でいくつかのテーブルをスケッチしてみましょう。(PostgreSQLでテスト済み) まず、顧客と製品。

-- Customer names aren't unique.
create table customers (
  cust_id integer primary key,
  cust_name varchar(15) not null
);
insert into customers values (1, 'Foo'), (2, 'Bar');

-- Product names are unique.
create table products (
  prod_id integer primary key,
  prod_name varchar(15) not null unique
);
insert into products values 
(150, 'Product 1'), (151, 'Product 2'), (152, 'Product 3');

製品にはさまざまなカテゴリがあります。

create table categories (
  cat_name varchar(15) primary key
);
insert into categories values ('Cable'), ('Networking'), ('Phones');

各製品は、複数のカテゴリに表示される場合があります。

create table product_categories (
  prod_id integer not null references products,
  cat_name varchar(15) not null references categories,
  primary key (prod_id, cat_name)
);

insert into product_categories values 
(150, 'Cable'), (150, 'Networking'), (151, 'Networking'), (152, 'Phones');

顧客は、いくつかのカテゴリの製品に関心がある場合があります。

create table customer_category_interests (
  cust_id integer not null references customers,
  cat_name varchar(15) not null references categories,
  primary key (cust_id, cat_name)
);

-- Nobody's interested in phones
insert into customer_category_interests values
(1, 'Cable'), (1, 'Networking'), (2, 'Networking');

customerproducts に外部キーがある場合、有効な顧客と有効な製品のみがそのテーブルに入ることが保証されますが、電話カテゴリの製品を、コピー機のみに関心がある顧客としてマークされた顧客に追加しようとするとどうなりますか?

顧客は、好みのカテゴリのすべての製品に関心があるわけではありません。重複する外部キー制約に注意してください。

create table product_interests (
  cust_id integer not null,
  prod_id integer not null,
  cat_name varchar(15) not null,
  foreign key (cust_id, cat_name) references customer_category_interests,
  foreign key (prod_id, cat_name) references product_categories,
  primary key (cust_id, prod_id, cat_name)
);

insert into product_interests values
(1, 150, 'Cable'), (2, 150, 'Networking');

顧客 1 は電話に関心がないため、この次の挿入は失敗します。

insert into product_interests values
(1, 152, 'Phones');
エラー: テーブル "product_interests" の挿入または更新が外部キー制約 "product_interests_cust_id_fkey" に違反しています
詳細: キー (cust_id, cat_name)=(1, Phones) がテーブル "customer_category_interests" に存在しません。
于 2015-03-10T13:11:25.807 に答える