我有一个表(称为表A),其中包含 alive 列。此列可以是1或0.如果为0则表示已删除该列。这是一个软删除。
我遇到的问题是我想验证此表中行的外键约束。如果我要从表A中删除一行,那么由于它与其他行的关系,通常会通过外键约束。这是好的和期望的。我的问题是,因为我的删除是软的(只是更新标志)我删除时没有任何约束检查。这意味着我需要手动检查关系。
无论如何我可以在oracle表中添加一个约束,它使用1和0作为完整性约束的一部分吗?例如,如果我将 alive 列更新为0,则会触及约束,因此不允许将列更改为0。
我能以某种方式这样做吗?
希望这是有道理的。
由于
答案 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首先被删除(或软删除 - 尽管你必须使约束可以延迟使用)。