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 上是唯一的,但在 (dept_id, alive) 上也有一个约束,以允许来自 emp 的引用约束。

这意味着您的应用程序现在需要在软删除一个部门时同时更新所有 emp 行 - 如果您不对其进行编码,则约束有效地确保该部门不能被软删除,除非 emp 是第一个已删除(或软删除 - 尽管您必须使约束延迟才能起作用)。

于 2013-03-13T03:00:58.133 回答