2

有効な列を持つテーブル(テーブルAと呼ばれる)があります。この列は1または0にすることができます。0の場合は、削除されたことを意味します。これはソフト削除です。

私が抱えている問題は、このテーブルの行に対する外部キー制約を検証したいということです。テーブルAから行を削除する場合、他の行との関係のために、外部キー制約を使用することがよくあります。これは良いことであり、期待されています。私が抱えている問題は、削除がソフトであるため(フラグを更新するだけ)、削除するときに制約チェックが行われないことです。これは、関係を手動で確認する必要があることを意味します。

とにかく、整合性制約の一部として1と0を使用するOracleテーブルに制約を追加できますか?たとえば、生きている列を0に更新すると、制約にぶつかるため、列を0に変更できなくなります。

どういうわけかこれを行うことができますか?

これが理にかなっていることを願っています。

ありがとう

4

1 に答える 1

2

モデリングの観点から、この場合、「ソフト削除」された行を別のテーブル (ジャーナル テーブルなど) に移動し、ハード削除を使用するという APC のコメントに傾倒します。

別のオプション (テストされていません) は、参照制約にソフト削除列を含めることです。たとえば、次のようになります。

CREATE TABLE dept (
  dept_id number,
  alive number,
  constraint alive_ck check (alive in (0,1)),
  constraint dept_pk primary key (dept_id, alive),
  constraint dept_uk unique (dept_id)
);

CREATE TABLE emp (
  emp_id number,
  dept_id number,
  alive number,
  constraint emp_pk primary key (emp_id),
  constraint emp_dept_fk
    foreign key (dept_id, alive)
    references dept (dept_id, alive)
);

dept テーブルは dept_id に対して一意ですが、emp からの参照制約を許可するために (dept_id, alive) に対しても制約があることに注意してください。

これは、アプリケーションが dept をソフト削除するときに同時にすべての emp 行を更新する必要があることを意味します。また、コード化しない場合、制約により、emp が最初に削除されない限り dept をソフト削除できないことが効果的に保証されます。削除されました(または論理的に削除されました-これが機能するには、制約を延期可能にする必要があります)。

于 2013-03-13T03:00:58.133 に答える