【问题标题】:How do I make a SQL constraint in one table affect a different table如何使一个表中的 SQL 约束影响另一个表
【发布时间】:2012-10-11 08:39:58
【问题描述】:

我有三张桌子

  • 比尔
  • 录音
  • 房子

在录制中,我有一个名为 DateRecored 的列。在 bill 中,我有一个名为 duedate 的列,而在 House 中,我有一个名为 Operational 的列。

我需要做一个约束,这样当账单逾期 60 天时,Operational 列将变为停用。

如果您需要信息,请告诉我,但我觉得这就是您所需要的。

【问题讨论】:

  • DBMS 是 Oracle/SQL Server/MySQL/PostgreSQL 等之一,你是说 Oracle?

标签: sql oracle triggers constraints


【解决方案1】:

如前所述,您正在寻找的是触发器,而不是约束。在 Oracle 中使用 DBMS_SCHEDULER,触发器将如下所示:

BEGIN
  DBMS_SCHEDULER.create_job (
    job_name        => 'update_operational_after',
    job_type        => 'PLSQL_BLOCK',
    job_action      => 'BEGIN UPDATE house set operational=false where id in (select house.id from House join Bill on (bill.house_id=house.id) where duedate > sydate+60; END;',
    start_date      => SYSTIMESTAMP,
    repeat_interval => 'freq=daily; byminute=0;byhour=0;byminute=0;bysecond=0',
    end_date        => NULL,
    enabled         => TRUE,
    comments        => 'Updates all operational to false if they've passed the due date');
END;
/

这会将给定的更新安排在每天午夜执行。

【讨论】:

    【解决方案2】:

    约束仅在您插入/更新/删除记录时生效。在您的情况下,Bill 表中给定记录的年龄应该触发不同表中的更改,并且您需要定期作业来执行此操作。如果没有任何用户触发的 DML 操作,DBMS 不会促进这种自动更新(通过触发器或约束)。

    【讨论】:

      猜你喜欢
      • 2013-11-26
      • 2017-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-12
      • 2019-10-14
      相关资源
      最近更新 更多