Oracle对软删除强制执行约束

时间:2013-03-12 20:24:02

标签: sql oracle oracle10g constraints

我有一个表(称为表A),其中包含 alive 列。此列可以是1或0.如果为0则表示已删除该列。这是一个软删除。

我遇到的问题是我想验证此表中行的外键约束。如果我要从表A中删除一行,那么由于它与其他行的关系,通常会通过外键约束。这是好的和期望的。我的问题是,因为我的删除是软的(只是更新标志)我删除时没有任何约束检查。这意味着我需要手动检查关系。

无论如何我可以在oracle表中添加一个约束,它使用1和0作为完整性约束的一部分吗?例如,如果我将 alive 列更新为0,则会触及约束,因此不允许将列更改为0。

我能以某种方式这样做吗?

希望这是有道理的。

由于

1 个答案:

答案 0 :(得分: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行 - 如果您不对其进行编码,则约束有效地确保了部门不能被软删除,除非emps首先被删除(或软删除 - 尽管你必须使约束可以延迟使用)。