在删除时使用默认值更新外键引用

时间:2012-07-01 21:18:54

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

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

                       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,限制和没有动作约束......

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 ......

2 个答案:

答案 0 :(得分: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不为null,因此如果对usertalbe有任何参照完整性约束(即,如果将bookid设置为FOREIGN KEY列),则会抛出错误。

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

答案 1 :(得分:0)

使用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 - 但是目前没有办法在删除时设置列的默认值并保持外键约束。