【问题标题】:update foreign key reference with default value on delete在删除时使用默认值更新外键引用
【发布时间】:2023-03-31 03:34:01
【问题描述】:

我目前正在制作一个关于主外键关系的表格......

                       book table                    

                bookid     bookname         author
                 0         No book           no author
                 1         Engg Maths        Greiwal
                 2         Java Basics       James Gosling
                 3         Mahabharata       Ved Vyasa
                 4         Ramayana          Valmiki
                 5         Harry Potter      JK Rowling




                        usertable

               userid       name           bookid
                1          Arjun             2
                2          Charles           2
                3          Babbage           3

这里的bookid是usertable中的外键,也是booktable中的主键..... 现在我听说了级联、setnull、restrict 和无操作约束......

0 被设置为 usertable 中 bookid 列的默认值.....

Now i want a situation when a bookid(primary) entry is deleted from the main table i.e booktable, the entires containing bookid in the user table should be updated to the default value ( i.e here 0 ).....

有什么方法吗...???

我只能说我正在研究 phpmyadmin mysql innodb......

【问题讨论】:

    标签: mysql phpmyadmin foreign-keys innodb foreign-key-relationship


    【解决方案1】:

    没有内置方法,但有一种解决方法。您可以使用 DELETE 触发器来完成此操作:

    DELIMITER $$
    CREATE TRIGGER `book_delete` BEFORE DELETE ON `booktable`
      FOR EACH ROW BEGIN
        UPDATE `usertable` SET `bookid` = 0 WHERE `bookid` = OLD.`bookid`;
      END $$
    DELIMITER ;
    

    但是,请注意 0 不为空,因此如果您对 usertalbe 有任何参照完整性约束(即,如果您将 bookid 设置为 FOREIGN KEY 列),则会引发错误。

    作为最佳实践,您确实应该使用 NULL 来表示 usertable 中的行在 booktable 中没有对应的行。

    【讨论】:

      【解决方案2】:

      使用 MySQL,您可以在外键上使用 ON DELETE SET NULL

      例如:

      CREATE TABLE t1 (
       id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
       title VARCHAR(256)
      ) ENGINE=InnoDB;
      
      CREATE TABLE t2 (
       id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
       parent_id INT UNSIGNED, 
       INDEX(parent_id),
       FOREIGN KEY (parent_id) REFERENCES t1(id) ON DELETE SET NULL
      ) ENGINE=InnoDB;
      
      insert into t2 values (null, 3);
      insert into t2 values (null, 2);
      

      这将导致表 t2 看起来像:

      +----+-----------+
      | id | parent_id |
      +----+-----------+
      |  2 |         2 |
      |  1 |         3 |
      +----+-----------+
      

      t1中删除一行如下:

      delete from t1 where id = 2;
      

      将导致:

      +----+-----------+
      | id | parent_id |
      +----+-----------+
      |  2 |      NULL |
      |  1 |         3 |
      +----+-----------+
      

      有趣的是,MySQL 会解析一个ON DELETE SET DEFAULT 子句——但是创建表会失败。

      所以简短的回答 - 您可以在删除时设置为 NULL - 但目前无法在删除时设置列的默认值并保持外键约束。

      【讨论】:

        猜你喜欢
        • 2018-09-02
        • 2019-10-29
        • 1970-01-01
        • 1970-01-01
        • 2017-05-15
        • 2019-05-10
        • 1970-01-01
        • 1970-01-01
        • 2021-08-16
        相关资源
        最近更新 更多