【问题标题】:Create after insert trigger which updates record by getting value from other Oracle 11g table通过从其他 Oracle 11g 表获取值来更新记录的插入触发器后创建
【发布时间】:2012-04-18 23:44:07
【问题描述】:

我有两张桌子

Parent(id, name, occupation)

Child(id, name, gender,parent_id, parent_name, parent_occupation)

现在要在孩子中插入值,我将运行 chi 查询

insert into Child(id,name,gender,parent_id) values(10,'XYZ','Male',15);

所以现在我的要求是,当执行此插入查询时,触发器将运行并从父表中获取 id 15(子记录的 parent_id)的名称和职业,并将其分别添加到字段 parent_name 和 parent_occupation 中新插入的行中.

我使用 Oracle 11g 作为我的数据库。

【问题讨论】:

  • parent_name 和 parent_occupation 是 parent 的一个属性,它们属于 parent 表,而不是 child..
  • @MatthewWatson,他们已经在PARENT 表中。由于这两个表通过CHILD.PARENT_ID 链接,CHILD 表中的两列是多余的。我同意 OP 需要审查他们的架构设计!

标签: oracle triggers insert


【解决方案1】:

您想要类似的东西(尽管您需要添加代码来处理异常):

CREATE OR REPLACE
TRIGGER ai_child_tg
AFTER INSERT ON child
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
BEGIN
   SELECT name,
          occupation
     INTO :NEW.parent_name,
          :NEW.parent_occupation
     FROM parent
    WHERE id = :NEW.parent_id;
EXCEPTION
   WHEN no_data_found
   THEN
        <handle_your_exception_>
END ai_child_tg;

但是,如果您的 CHILD 表确实是您的 PARENT 表的关系子表,并且存在 FK 关系(通过 CHILD.PARENT_ID 列),则将 PARENT_NAMEPARENT_OCCUPATION 列存储在CHILD 表在逻辑上是冗余的。

我想问问你为什么在CHILD 表中有这两列。

希望对你有帮助...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-07
    • 2021-08-13
    相关资源
    最近更新 更多