【问题标题】:foreign key in sql : Oraclesql中的外键:Oracle
【发布时间】:2016-10-12 05:27:11
【问题描述】:

父表

标识 | name /// id 主键

1 |古都斯

子表

标识 | name /// id 主键和外键

1 |古都斯

这里,我用过delete cascade。这就是为什么,如果我从父表中删除任何元组,它也会从子表中删除。但是如果我尝试更新父表中的 id,它不会影响子表,而是说 ERROR!

所以我的问题是我可以通过哪种方式同时更新父表和子表。

谢谢!对不起,因为我不是一个好的英语作家!

【问题讨论】:

    标签: sql oracle foreign-keys primary-key


    【解决方案1】:

    Oracle 中没有“更新级联”。 您应该在更新父表时为更新子表编写一个触发器。 看看这个网站。你会看到你的示例触发器。只写一个触发器。 https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:5773459616034

    【讨论】:

      【解决方案2】:

      这看起来是个糟糕的设计。如果子表的 ID 应该跟在父表的 ID 后面,那为什么还要有子表呢?您也可以将子表的列添加到父表中。

      在更常见的设计中,子表将拥有自己的 ID (PK) 列和另一个 ID_Parent 列来引用父表。

      同样不寻常的是需要更新 PK 列。其实这绝对是NO。

      【讨论】:

      • 我不想知道它是不是糟糕的设计!这根本不是我的数据库设计。这只是提出该问题的示例设计。
      • 我的回答是,你不应该首先问这些问题,因为在现实的数据库编程世界中没有人应该这样做。
      • 我认为作为一个初学者级别的问题,这没关系。任何问题都可以浮现在我的脑海中。我有权提出这个问题以使自己清楚这一点。我再说一遍,这是一个提出这个问题的示例设计。设计好不好没关系。
      • 你是对的。只要它证明了为什么它是糟糕的设计,你就学到了一些东西。
      • 感谢您的评论
      【解决方案3】:

      不幸的是,Oracle 中没有所谓的级联更新。所以你要做的就是创建一个触发器,然后进行更新:

      CREATE TABLE t1(c1 number primary key);
      CREATE TABLE t2(c2 number references t1(
      
      INSERT INTO t1 VALUES(1);
      INSERT INTO t2 VALUES(1);
      
      CREATE TRIGGER Cascade_Update
          AFTER UPDATE OF c1 ON t1
          FOR EACH ROW
      BEGIN
          UPDATE t2
          SET c2 = :new.c1
          WHERE c2 = :old.c1;
      END;
      

      现在进行更新,它也会更新子表。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多