2017-04-13 64 views
1

为了简化问题,我有三个表:添加到一个表的外键

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> 
+2

好吧,这是不言自明的,你试着在publishers中添加pub_id并不存在的书 – Peter

+0

我已经经历了所有这些小问题 - 变量名拼写是否正确,你是否添加了存在的pub_id - 并确保它们都是正确的。在这种情况下,我有五个发布者和五个作者,都标记为1-5,我一直在向两个字段添加'1'来测试它。编辑:它确实有助于知道这不应该发生,但! –

+1

你能告诉我们你的插入查询吗? – Peter

回答

2

好吧现在,当你添加所有的代码一切都很清楚

<select author_id="author_id"/> 
<select pub_id="pub_id"/> 

应该

<select name="author_id"> 
<select name="pub_id"> 
1

的问题是,你正在构建的HTML。例如你有选择,如下出版商:

<select pub_id="pub_id"/> 

这是打开和关闭在一个<select>去。另一个问题是,你没有一个name属性您选择的元素,这意味着它无法引用它们。最终,您的查询尝试将NULL插入到外键列中,而不是允许的值。

使用<select name="pub_id">出版商和作出相应的修改也是作者。