外键可以防止在mysql中删除数据

时间:2015-05-07 16:17:39

标签: php mysql sql-server database

我正在为我的项目设计一个图书馆的网站。

无论如何,我有三个名为booksuserssavebook的表。

book包含以下列:“bookid”,“title”,“author”“genre”和“summary ”。

users包含以下列useridusernamepasswordname

用户可以将图书保存为收藏夹,并将保存的图书保存在名为savebook的表格中,其中列bookiduserid是表格book和{的外键{1}}

我使用了以下查询:

users

ALTER TABLE savebook
ADD CONSTRAINT bkid_usid
FOREIGN KEY (bookid)
REFERENCES books (bookid);

现在问题是每当我尝试使用查询

从表ALTER TABLE savebook ADD CONSTRAINT usid_bkid FOREIGN KEY (userid) REFERENCES users(userid); 删除一本书时
book

我收到此消息:

  

1451 - 无法删除或更新父行:外键约束失败(DELETE FROM books WHERE bookid=1; booklibrary,CONSTRAINT savebook FOREIGN KEY(bkid_usid)REFERENCES {{1 } {(bookid))

如何删除表books中的某本书,该书还会删除表bookid中的相关行?

4 个答案:

答案 0 :(得分:3)

要获得您描述的行为,您可以指定

ON DELETE CASCADE

作为外键定义的一部分。

参考:http://dev.mysql.com/doc/refman/5.5/en/create-table-foreign-keys.html

如果要修改外键约束bkid_usid(在booksave表上),则显示删除语句

DELETE FROM books WHERE ...

会导致MySQL删除booksave中具有引用从books删除行的外键值的行。

答案 1 :(得分:0)

ALTER TABLE savebook
ADD CONSTRAINT bkid_usid
FOREIGN KEY (bookid)
REFERENCES books (bookid)
ON DELETE CASCADE
;

记下我从原始问题添加到ALTER的最后一行,它是外键定义的可选部分(还有ON UPDATE ...)。默认情况下,如果没有指定,我相信MySQL会将其视为NO ACTIONRESTRICT(这两个实际上与我所知的实际相同)而不是CASCADE。在http://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html

找到完整文档

答案 2 :(得分:0)

一个有趣的问题:) 我认为问题是由所谓的“参照完整性”引起的。 这意味着,您无法删除数据集,哪个主键在另一个表数据集中用作外键。如果你可以这样做,表保存工具的一些外键将引用表格书中的数据集,这些数据集不再存在。 因此,首先必须删除savebook中的所有数据集,其中bookid与您要删除的书籍相同,之后,您可以从书籍中删除此数据集。 ;)

答案 3 :(得分:0)

您已对表格应用了约束。如果从“book”表中删除任何条目,您需要告诉MySQL从“savebook”表中删除引用的条目。

ALTER TABLE savebook ADD CONSTRAINT bkid_usid FOREIGN KEY (bookid) REFERENCES books (bookid) ON DELETE CASCADE
相关问题