2013-03-12 124 views
2

我有一个表(称为表A),它具有活动列。此列可以是1或0.如果它是0,则表示它已被删除。这是一个软删除。Oracle强制执行软删除约束

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

是否有无论如何我可以添加一个约束到一个oracle表,它使用1和0作为完整性约束的一部分?例如,如果我将活动列更新为0,则它​​将遇到约束,因此不会允许将列更改为0.

可以以某种方式执行此操作吗?

希望这是有道理的。

感谢

+0

我不认为你可以用外键约束来做到这一点。我认为你最好的选择将是一个触发器。你想要一个例子吗? – 2013-03-12 21:00:58

+0

如果您从表中删除一行并收到错误,则会抛出异常。你如何更新你的国旗?在单独的过程中还是在删除过程中?没有1和0是Integr的一部分。约束。您只能添加检查约束,例如,您的标志位于1或0的位置。如果这有意义,您也可以考虑触发器来更新某些其他表中的某些值。请发布样本数据,表格,数据等... – Art 2013-03-12 21:01:47

+0

感谢您的意见。我正在考虑一个触发器,但希望我能够更简单地做一些约束。谢谢您的帮助。我会用一个触发器来代替... – RNJ 2013-03-12 21:10:21

回答

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_id独一无二的,但也有一个约束过度(dept_id为,alive)来允许emp的引用约束。

这意味着您的应用程序现在需要在软删除一个部门的同时更新所有的emp行,并且如果您没有对其进行编码,那么该约束将有效地确保该部门不能被软删除,除非emps首先被删除(或软删除 - 尽管你必须使约束延迟才能工作)。

+0

我倾向于upvote这个答案,因为它在技术上是正确的 - 但ACP的评论似乎更有帮助。 – 2013-03-13 06:38:08

+0

谢谢。我开始认为硬删除可能会更好。但复合关键思想是一个很好的想法。这就是我之后的事情。谢谢 – RNJ 2013-03-14 10:33:49