【问题标题】:After Update Trigger SQL更新后触发 SQL
【发布时间】:2020-12-14 18:34:52
【问题描述】:

大家好,我在 oracle sql 中创建了两个表,第一个有 2 列,第二个有 3 列(其中一个是来自第一个表的 Pk 的外键)。 我想创建一个触发器,在我更新第二个表中的外键列之后,将根据 pk 的值更新其他列。

  • Table1(idF,名称)
  • table2(id, idF, name)

我想创建一个触发器,当我在 table2 中更新 idF(外键)时,将显示与 table1 中相同的名称。

【问题讨论】:

  • 请仅使用您真正使用的数据库进行标记。我删除了无关的数据库标签。
  • 为什么? FK 的目的是将表联系在一起,而不必重复信息。如图所示,我看不到 table2 的原因。
  • 这只是一个更好理解的例子
  • 这可能是“只是一个更好理解的例子”,但@AdrianKlaver 的观点非常笼统。您的数据模型违反了表设计的第三范式。 Table2 中的列 idF 不是候选键(即使您想要它也不能是表中的主键),但它仍然完全确定列 name。这会导致很多问题——例如,需要创建像您现在正在考虑的触发器一样的触发器。不要将依赖属性name存储在第二个表中;仅将其存储在第一个表中。
  • 如果您需要 Table2 中的预计算名称,例如为了更快地执行查询,请使用 view(在这种情况下很可能是物化视图) .这是比触发器更好的方法。

标签: sql oracle


【解决方案1】:

您可以在oracle中创建触发器如下:

Create or replace trigger trg_table2
Before update of idf on table2
For each row
When (old.idf <> new.idf and new.idf is not null)
Begin
Select name into :new.name 
  from table1
 Where idf = :new.idf;
End;
/

【讨论】:

    【解决方案2】:

    您可以在 table1 上的更新触发器后使用它

    delimiter $$
    create trigger MyTrigger after update on table1 
    for each row
    begin
        update table2 set name = new.name where idF = new.idF;
    end$$
    

    【讨论】:

    • 实际上是当我更新表 2 中的外键(idF)时,我也需要触发器来更新表 2 上的“名称”列。例如:在 table1 中,当我更新 table2 中的 idF 以显示与 table1 相同的名称时,我想要一行(idF=1,name="John")
    猜你喜欢
    • 1970-01-01
    • 2018-02-05
    • 2016-11-03
    • 2015-01-20
    • 2014-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    相关资源
    最近更新 更多