为了简化问题,我有三个表:
Books(isbn, title, author_id, pub_id)
Authors(id, first_name, last_name)
Publishers(pub_id, name)
Books有两个外键,author_id和pub_id。他们被设定为"限制"删除和更新,我认为这意味着如果你试图删除或改变作者或出版商表中的一行,而它被书籍使用,它会阻止你。
我想在书籍中添加一本新书,但每次尝试我都会得到:
错误:SQL错误:错误:1452错误:无法添加或更新子项 row:外键约束失败
(emilyc_library.Books, CONSTRAINT publisher_foreign_key FOREIGN KEY (pub_id) REFERENCES Publishers (pub_id))
当我禁用pub_id外键并尝试使用author_id时,会发生同样的事情。
当我禁用两个外键时,一切正常。
我已经四处寻找并且大多数时候看到了在你想要插入时禁用你的外键的hack-y答案,这两者似乎都是不切实际的,并且违背了外键约束的目的。
造成这个问题的原因是什么?是否真的是MySQL的设计,你不能更新到具有外键约束的表中?
编辑:我的插入代码如下所示:
在addbooksrv.php中:
<?php
include 'dbconnect.php';
$sql = "insert into Books (isbn,name,author_id,pub_id) values
('" .
$_REQUEST["isbn"] . "','" .
$_REQUEST["name"] . "','" .
$_REQUEST["author_id"] . "','" .
$_REQUEST["pub_id"] .
"')";
if (!$result = $mysqli->query($sql)) {
echo "Error: SQL Error: </br>";
echo "Errno: " . $mysqli->errno . "</br>";
echo "Error: " . $mysqli->error . "</br>";
exit;
}
?>
在addbookclt.php中,author_id和pub_id已选择显示可用ID的框:
<table>
<form action="addbooksrv.php">
ISBN: <input type="int" name="isbn"/></br>
Book: <input type="text" name="name"/></br>
Author: <select author_id="author_id"/>
<?php
include "dbconnect.php";
$sql = "select * from Authors";
$result = myquery($mysqli,$sql);
while($row = $result->fetch_assoc()) {
echo "<option value = '" . $row["author_id"] . "'>" . $row["id"] . "
</option>";
}
?>
</select>
</br>
Publisher: <select pub_id="pub_id"/>
<?php
$sql = "select * from Publishers";
$result = myquery($mysqli,$sql);
while($row = $result->fetch_assoc()) {
echo "<option value = '" . $row["pub_id"] . "'>" . $row["pub_id"] . "
</option>";
}
?>
</select>
</br>
<input type="submit"/>
</form>
</table>
答案 0 :(得分:2)
好的,当你添加所有代码时,一切都很清楚
<select author_id="author_id"/>
<select pub_id="pub_id"/>
应该是
<select name="author_id">
<select name="pub_id">
答案 1 :(得分:1)
问题出在您正在构建的HTML中。例如,您已让发布商选择如下:
<select pub_id="pub_id"/>
一次性打开和关闭<select>
。另一个问题是,您的选择元素没有name
属性,这意味着它无法引用它们。最终,您的查询尝试将NULL插入外键列,而不是允许的值。
对发布商使用<select name="pub_id">
,并对作者进行相关更改。