リレーショナルモデルとSQL標準は、この種の要求をアサーションでサポートします。しかし、AFAIKは、現在出荷しているSQL製品はCREATE ASSERTION
をサポートしていません。
この種のコードは、製品ごとに2つ以上のカテゴリが存在しないという要件を強制します。
create table product_categories (
product_code char(1) not null, -- references products (product_code), not shown
category_num integer not null
default 1
check (category_num in (1, 2)),
category varchar(10) not null,
primary key (product_code, category)
);
insert into product_categories values
('a', 1, 'wire'),
('a', 2, 'cable'),
('b', 1, 'panel'),
('b', 2, 'plate');
「category_num」を1または2以外に挿入すると、エラーが発生することは明らかです。したがって、各製品コードは2つ以上のカテゴリを持つことはできません。
各製品に少なくとも1つのカテゴリが必要であるという制約を適用するには、手順コードを記述する必要があります。トリガまたはストアドプロシージャのいずれかが機能します。
Oracleに宣言型アサーションを追加することについての議論:SQL Assertions/Declarative multi-row constraints
あなたの答えは素晴らしいですが、私はコードでそれを作る場合は、たとえば、私は、クエリは、この製品が含まれている場合どのように多くのカテゴリをチェックして行った場合出力は2行ですが、私は製品がより多くのことを許していません。逆も同様です...これは良いか悪い方法ですか? –
通常は、エラーがあれば挿入してトラップし、適切な処置をとるだけです。とにかくエラーをトラップする必要があります。すでに2つの行があるだけでなく、間違っていることがたくさんあります。 (私はストアドプロシージャでそれをやっていました。自分自身で、すべての挿入と削除がストアドプロシージャを通過するように要求しています) –
助けてくれてありがとう:D –