我目前正在制作关于主要外键关系的表....
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 ......
答案 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
- 但是目前没有办法在删除时设置列的默认值并保持外键约束。