为了简化问题,我有三个表:添加到一个表的外键
Books(isbn, title, author_id, pub_id)
Authors(id, first_name, last_name)
Publishers(pub_id, name)
书籍有两个外键,AUTHOR_ID和pub_id分组。它们被设置为“限制”在两个删除和更新,我假设意味着它阻止你,如果你试图删除或修改从作者或出版商表中的一行,而它的正在使用的书籍。
我想添加一个新的书成表书籍,但每次我尝试时,我得到:
Error: SQL Error: Errno: 1452 Error: Cannot add or update a child row: a foreign key constraint fails
(emilyc_library.Books, CONSTRAINT publisher_foreign_key FOREIGN KEY (pub_id) REFERENCES Publishers (pub_id))
当我禁用的pub_id外键,并与刚刚AUTHOR_ID尝试同样的事情发生。当我禁用这两个外键
一切正常。
我周围戳,大多看到的黑客-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>
好吧,这是不言自明的,你试着在publishers中添加pub_id并不存在的书 – Peter
我已经经历了所有这些小问题 - 变量名拼写是否正确,你是否添加了存在的pub_id - 并确保它们都是正确的。在这种情况下,我有五个发布者和五个作者,都标记为1-5,我一直在向两个字段添加'1'来测试它。编辑:它确实有助于知道这不应该发生,但! –
你能告诉我们你的插入查询吗? – Peter