我正在为我的项目设计一个图书馆的网站。
无论如何,我有三个名为books
,users
和savebook
的表。
表book
包含以下列:“bookid
”,“title
”,“author
”“genre
”和“summary
”。
表users
包含以下列userid
,username
,password
和name
。
用户可以将图书保存为收藏夹,并将保存的图书保存在名为savebook
的表格中,其中列bookid
和userid
是表格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
,CONSTRAINTsavebook
FOREIGN KEY(bkid_usid
)REFERENCES {{1 } {(bookid
))
如何删除表books
中的某本书,该书还会删除表bookid
中的相关行?
答案 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 ACTION
或RESTRICT
(这两个实际上与我所知的实际相同)而不是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