0

次の DDL を変更して CHECK 制約を追加し、店のマネージャーが同じ店で働き、タイプが「ローカル」の場合に店がすべての製品を供給するようにしたいと考えています。

誰でも助けることができますか?

CREATE TABLE employee(
  employee_number CHAR(5) NOT NULL,
  name VARCHAR(30),
  store_code CHAR(5)
  PRIMARY KEY(employee_number),
  FOREIGN KEY(store_code) REFERENCES store
  )

CREATE TABLE store(
  store_code CHAR(5) NOT NULL,
  type VARCHAR(15),
  employee_number CHAR(5),
  PRIMARY KEY(store_code),
  FOREIGN KEY(employee_number) REFERENCES employee
  )


CREATE TABLE product(
  product_code CHAR(5) NOT NULL,
  description VARCHAR(150),
  cost DEC(10,2),
  PRIMARY KEY(product_code)
  )

CREATE TABLE stocks(
  store_code CHAR(5) NOT NULL,
  product_code CHAR(5) NOT NULL,
  PRIMARY KEY(product_code, store_code),
  FOREIGN KEY(product_key) REFERENCES product,
  FOREIGN KEY(store_code) REFERENCES store
  )
4

4 に答える 4

0

RDBMS に応じて実装が変わりますが、オプションが表示されます。

  • 関数/ストアド プロシージャを呼び出す制約を確認します。
  • トリガー、またはカスタム ストアド プロシージャ。
  • 挿入選択構文の使用

関数を呼び出すチェック制約

関数を作成し、制約を作成するときにそれを利用する必要があります。

例/ソース:

カスタム ストアド プロシージャ/関数

トリガーを使用した提案されたソリューションに加えて、別のオプションは、データの挿入に使用されるストアド プロシージャを作成することです。

ストアド プロシージャは検証を実行し、条件が満たされない場合はデータを挿入しません。

選択での挿入の使用

以下は、従業員が特定の店舗で働いていない限り、管理エントリが追加されないようにします。

INSERT INTO manager (emploee_number, store_code) AS
SELECT distinct employee_number,
       store_code
FROM manages
WHERE store_code = INPUT_STORE_CODE
  AND employee_number = INPUT_EMPLOYEE_NUMBER
于 2013-06-20T16:31:33.303 に答える
0

これを行うには、works_at の主キーを変更し、一意性を確保するために一意の制約を追加します。これは、チェック制約を使用するよりも優れています。

CREATE TABLE works_at(
  employee_number CHAR(5),
  store_code CHAR(5),
  PRIMARY KEY(employee_number, store_code),
  FOREIGN KEY(employee_number) REFERENCES employee,
  FOREIGN KEY(store_code) REFERENCES store,
  CONSTRAINT UQ_Works_at_employee_number UNIQUE NONCLUSTERED(employee_number) -- ENSURES EMPLOYEE CAN ONLY WORK AT ONE STORE
  )

次に、managesテーブルを参照works_atして、彼らが働いている店舗を管理できるようにします。

CREATE TABLE manages(
  employee_number CHAR(5),
  store_code CHAR(5),
  PRIMARY KEY(store_code),
  FOREIGN KEY(employee_number, store_code) REFERENCES works_at (employee_number, store_code)
  )

2番目の部分に関しては、在庫にはすべての店舗とすべての製品が含まれている必要があるという事実を強制する方法がわかりません。これも無意味に思えます.他の 2 つのテーブル。

于 2013-06-20T16:46:14.597 に答える
0

マネージャーが実際に店で働いていることを確認するには、次のようにします。

drop table manages;

alter table works_at
add column isManager bit default 0;

他の回答で述べたように、すべての店舗がすべての製品を在庫していることを確認するには、トリガーを使用するのが最適です。

また、次の点も考慮する必要があります。

  1. char(5) は必ずしも主キー フィールドに最適なデータ型ではない
  2. 従業員番号を主キーにすることは、あまり良い考えではないかもしれません。実生活では異動があったり、複数の店舗でアルバイトをしている人がいるかもしれません。
  3. すべての店舗がすべての商品を在庫している場合、stocks テーブルは役に立たない可能性があります。手持ちの数量を含む在庫表の方がよい場合があります。
于 2013-06-20T16:38:45.693 に答える
0

CHECK 制約は、1 つのテーブル内の 1 つの行に制限されています。

そのようなチェックを本当に実装したい場合は、トリガーを使用する必要があると思います。

works-at と manages の多対多の関係をモデル化したことに注意してください。多対 1 の場合は、Employee(number, name, works_at_store_code, manages_store_code) のように見えるため、実行可能でした。制約は単純に CHECK (manages_store_code が null または manages_store_code = works_at_store_code) になります。

于 2013-06-20T16:30:06.140 に答える