2017-10-06 3 views
0

私はデータベースプロジェクトを作成しています。 nullの外部キーを含む行を更新しようとすると、エラーCannot add or update a child row: a foreign key constraint fails ("archaelogy"."artifact", CONSTRAINT "location" FOREIGN KEY ("location_id") REFERENCES "location" ("location_id") ON DELETE NO ACTION ON UPDATE SET NULLが返されます。 nullの外部キーが含まれている行を追加できますが、更新はできません。(SQL)NULL外来キーエラーが含まれている行を更新します。

これは私のPHPコードです:

function editArtifact($editData){ 
$query = "UPDATE artifact SET worker_id=?, image=?, period=?,location_id=?, coordinate_x=?, coordinate_y=?, type=?, comment=?) WHERE artifact_id=?"; 
$stmt = $this->con->prepare($query); 
$stmt->bind_param("ibsiddsss", $editData['worker_id'],$editData['image'],$editData['period'],$editData['location_id'],$editData['coordinate_x'],$editData['coordinate_y'],$editData['type'],$editData['comment'],$editData['artifact_id']); 

if ($stmt->execute()) { 
    echo json_encode(array("editStatus"=>array('success'=>true))); 
}else{ 
    echo json_encode(array("editStatus"=>array('success'=>false))); 
} 

$stmt->close(); 

}

と、これは私のポストです:

artifact_id=qw & worker_id=1 & image=null & period=null & location_id=null & coordinate_x=null & coordinate_y=null & type=null & comment=null 

データベースの設計:

database design

私はそれを理解していない、私はnullの列を挿入することはできますが、それを更新することはできません。

+0

'location'テーブルがプライマリテーブルです。正しい?もしそうであれば、あなたが更新している間、ロケーションテーブル 'location_id'とアーティファクト' location_id'は同じタイプでなければなりません。 –

+0

@elumalai_kpロケーションテーブルには主キーとしてlocation_idがあり、アーティファクトテーブルにはロケーションテーブルで参照される外部キーとしてlocation_idもあります。 location_ids '型はint [11]です。 –

+0

ロケーションとアーティファクトテーブルのテーブル構造を表示できますか? –

答えて

1

ええ、私は問題を修正しました。問題は私のPHPコードにあった。私はisset構造体でnull値を決定しようとしていました。私が '==='でヌルを判断しようとすると、問題は解決されました。

固定PHPコード:

<?php 
require_once "DbOperations.php"; 
$response=array(); 
if($_SERVER['REQUEST_METHOD']=='POST'){ 
    if (isset($_POST['artifact_id'])) { 

$editData; 
if($_POST['artifact_id']!=='null'){ 
    $editData['artifact_id']=$_POST['artifact_id']; 
    if($_POST['worker_id']!=='null'){ 
    $editData['worker_id']=$_POST['worker_id']; 
    }else{ 
    $editData['worker_id']=null; 
    } 
    if($_POST['image']!=='null'){ 
    $editData['image']=$_POST['image']; 
    }else{ 
    $editData['image']=null; 
    } 
    if($_POST['period']!=='null'){ 
    $editData['period']=$_POST['period']; 
    }else{ 
    $editData['period']=null; 
    } 
    if($_POST['location_id']!=='null'){ 
    $editData['location_id']=$_POST['location_id']; 
    }else{ 
    $editData['location_id']=null; 
    } 
    if($_POST['coordinate_x']!=='null'){ 
    $editData['coordinate_x']=$_POST['coordinate_x']; 
    }else{ 
    $editData['coordinate_x']=null; 
    } 
    if($_POST['coordinate_y']!=='null'){ 
    $editData['coordinate_y']=$_POST['coordinate_y']; 
    }else{ 
    $editData['coordinate_y']=null; 
    } 
    if($_POST['type']!=='null'){ 
    $editData['type']=$_POST['type']; 
    }else{ 
    $editData['type']=null; 
    } 
    if($_POST['comment']!=='null'){ 
    $editData['comment']=$_POST['comment']; 
    }else{ 
    $editData['comment']=null; 
    } 

    $db = new DbOperations(); 
    $db->editArtifact($editData); 
    } 
    }else{ 
     $response['error']=true; 
     json_encode($response); 
    } 
    } 
?> 

問題を解決しようとするためのおかげでみんな。私はアンドロイドアプリからデータを投稿しています。なぜそれがnull文字列をポストしているのかわかりません。

2

artifactlocation_idの値がlocationテーブルに存在しないと更新しようとしていると思います。また、投稿パラメータlocation_id=nullも確認してください。 locationテーブルには、location_idがnullとして存在しないことがあります。お役に立てれば!

location_idartifactテーブルでNULLの値を許可する必要があります。

注:更新/削除操作にSET NULLルールを使用するには、外部キー列にNULL値を許可する必要があります。それ以外の場合、SET NULL指定はエラーメッセージを生成して失敗します。

+0

ロケーションテーブルのプライマリキーはlocation_idなので、null location_idをこのテーブルに追加することはできません。私はちょうどforeign_keyとしてnull location_idに含まれているアーティファクトテーブルに行を更新したいです。 –

関連する問題