【问题标题】:Oracle enforcing constraints on soft deleteOracle 对软删除实施约束
【发布时间】:2013-03-12 20:24:01
【问题描述】:

我有一个具有 alive 列的表(称为表 A)。此列可以为 1 或 0。如果为 0,则表示已删除。这是软删除。

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

我是否可以向使用 1 和 0 作为完整性约束的一部分的 oracle 表添加约束?例如,如果我将 alive 列更新为 0,它将达到约束,因此不允许将列更改为 0。

我可以这样做吗?

希望这是有道理的。

谢谢

【问题讨论】:

  • 我认为你不能用外键约束来做到这一点。我认为你最好的选择是触发器。你想要一个例子吗?
  • 如果您从表中删除一行并收到错误,则会引发异常。你如何更新你的旗帜?在单独的过程中还是在删除期间?没有 1 和 0 是 integr 的一部分。约束。例如,您只能在标志为 1 或 0 的地方添加检查约束。如果这有意义,您可能还会想到会更新某些其他表中的某些值的触发器。请发布示例数据、表格、数据等...
  • 感谢您的 cmets。我正在考虑一个触发器,但希望我能够在一些约束下更简单地做到这一点。谢谢您的帮助。我将使用触发器...
  • 我真的不知道你想在这里发生什么。您是否要确保软删除不会发生在具有子行的行上? “打破约束”是什么意思?
  • 这类问题是正确思考的人反对软删除而偏爱硬删除和日志表的原因。

标签: sql oracle oracle10g constraints


【解决方案1】:

从建模的角度来看,在这种情况下,我倾向于 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 首先被删除(或软删除 - 尽管您必须使约束延迟才能起作用)。

【讨论】:

  • 我倾向于赞成这个答案,因为它在技术上是正确的 - 但 ACP 的评论似乎更有帮助。
  • 谢谢。我开始认为硬删除可能会更好。不过,复合键的想法是个好主意。这就是我所追求的。谢谢
猜你喜欢
  • 1970-01-01
  • 2011-04-11
  • 1970-01-01
  • 2022-12-11
  • 2012-10-26
  • 1970-01-01
  • 2019-06-15
  • 2016-12-14
  • 2022-01-26
相关资源
最近更新 更多