2017-04-13 13 views
1

でテーブルに追加、私は3つのテーブルを持っています。それらは、削除と更新の両方で「制限」に設定されています。これは、書籍によって使用されている間、AuthorsまたはPublishersテーブルから行を削除または変更しようとすると、あなたが停止することを意味します。問題を単純化するために外部キー

私はテーブルブックに新しい本を追加したいが、私がしようとするたびに私が取得:

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にしようとすると、同じことが起こります。

両方の外部キーを無効にするとすべて動作します。

挿入したいときに外部キーを無効にするためのhack-yの回答がほとんど見られました。どちらも実用的ではなく、外部キー制約の目的を破っています。

この問題の原因は何ですか。それは本当にあなたが外部キーの制約を持つテーブルに更新できないMySQLの設計ですか?

EDIT:私の挿入コードは次のようになります。addbooksrv.phpで

:addbookclt.php、AUTHOR_IDとpub_idカラムで

<?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; 
} 
?> 

は、利用可能な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

これは自明ですが、出版社には存在しないpub_idの本を追加しようとしています – Peter

+0

これらの小さな問題はすべて解決しました。変数名が正しく入力されているか、存在するpub_idを追加していますか?それらがすべて正しいことを確認しました。この場合、私は5人の出版社と5人の著者(両方とも1-5とラベル付けされています)を持っており、私は両方のフィールドに「1」を追加してテストしています。編集:これは、起こるはずではないことを知るのに役立ちます! –

+1

挿入クエリを表示できますか? – Peter

答えて

2

すべてのコードをすべて追加したときにすべてが表示されるようになりました。

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

問題は、あなたが構築しているHTMLにある

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

でなければなりません。

<select pub_id="pub_id"/> 

一度に<select>を開閉ます:たとえば次のように選択し、出版社を持っています。もう1つの問題は、選択した要素にname属性がないことです。つまり、要素を参照できません。最終的には、クエリは、許可された値ではなく、外部キーの列にNULLを挿入しようとしています。

出版社には<select name="pub_id">を使用し、著者にも関連する変更を行います。

関連する問題