0

5つのテーブルを持つデータベースがあります

students    PK    : ID -> anum, first, last
studentinfo PK/FK : ID -> why, student_commenets, finished, aidyear
Times       PK/FK : ID -> signintime, counselor_start_time, 
                           additional_time, finish_time
counselor   PK/FK : ID -> firstcounselor, secondcounselor, thirdcounselor
Comments    PK/FK : ID -> counselorcomments, additional_commenets

私はsigninpage.phpというページを持っています

そのページでは、3 つの異なるテーブル (student、studentinfo、および time) に書き込む必要があります。

私のコードはfallowsです:

if (empty($errors) === true) 
{
include('core/queries/inserts.updates.selects/students.php');   
include('core/queries/inserts.updates.selects/studentinfo.php');
include('core/queries/inserts.updates.selects/signintime.php'); 

$dbh = null;    
header('location: signedin.php');
exit(); 
}

各ファイルは実際の挿入クエリです。(あなたがそれらを見る必要がある場合は、この投稿を更新します)

私が持っているエラーは次のとおりです。

SQLSTATE [23000]: 整合性制約違反: 1452 子行を追加または更新できません: 外部キー制約が失敗しました ( test. times, CONSTRAINT times_ibfk_2FOREIGN KEY ( id) REFERENCES students ( id) ON DELETE CASCADE ON UPDATE CASCADE)

これに加えて、最初のクエリ (students.php と 2 番目のクエリ studentinfo.php) は問題なく挿入されています。同じ ID、テーブルに挿入する signintime で問題が発生します: 回。

phpmyadmin では、両方のテーブル (studentinfo と times) が同じように構成され、学生がセッション (PK ID) を開始するため、削除時にカスケードされ、元のテーブル (student) に更新されます。

このエラーを解決するにはどうすればよいですか?

編集 :

<?php
require('core/init.php');

try 
{
    $null = NULL;
    $query = $dbh->prepare("INSERT INTO `times` (signintime) VALUES (:signintime)");
    $query->bindParam(':signintime' , $null);
    $query->execute();
}

        catch (PDOException $e) 
        {
                error_log($e->getMessage());
                die($e->getMessage());
        }   
?>
4

2 に答える 2

0

あなたのテーブルのデザインは私には間違っているように見えます。timesテーブルの各行に対して、テーブルに複数のエントリが存在する可能性があると想定していstudentsます。その場合、 に次の列が必要になりますtimes

id - PK
student_id - FK
signintime
counselor_start_time
additional_time
finish_time

この場合、特定の生徒の各行の値は同じstudent_idですが、値が異なりidます。

于 2013-01-15T15:13:11.703 に答える
0

次のステートメントと例は、あなたが言及した表とは異なりますが、考え方は同じです。

エラーが生成された理由は、その値がまだ親テーブルに存在しないテーブルに値を挿入しようとしたためです。テーブルは、他のテーブル ( Parent )に依存していることを意味します。

さらに説明するには、次のスキーマを検討してください。

CREATE TABLE StudentList
(
  ID INT PRIMARY KEY,
  NAme VARCHAR(50)
);

CREATE TABLE AddressList
(
  StudentID INT,
  Address VARCHAR(50),
  CONSTRAINT tb_fk FOREIGN KEY (StudentID) 
    REFERENCES StudentList(ID)
);

INSERT INTO StudentList VALUES (1, 'Jon');
INSERT INTO StudentList VALUES (2, 'Skeet');

INSERT INTO AddressList VALUES (1, 'Hello');
INSERT INTO AddressList VALUES (2, 'World');
INSERT INTO AddressList VALUES (1, 'Other Address');

と の 2 つのテーブルがありStudentListますAddressList。テーブルAddressは子テーブルであり、テーブルに依存していますStudentList(親テーブルとも呼ばれます)。StudentIDtable の列に挿入できる唯一の値はAddressList1 and 2それらがIDtable で見つかった唯一の s であるためStudentListです。

1 and 2テーブル以外の ID を持つレコードを挿入しようとするとAddress、たとえば

INSERT INTO AddressList VALUES (1, 'Other Address');

次のことを伝えるエラーが生成されます。

子行を追加または更新できません: 外部キー制約が失敗しました ( db_2_ec2e8. addresslist, CONSTRAINT tb_fkFOREIGN KEY ( StudentID) REFERENCES studentlist( ID)):

テーブルに挿入されている列の値がStudentID親テーブル ( StudentList ) で使用できないためです。

ですから、これがあなたの理解に役立つことを願っています。

于 2013-01-15T15:24:05.817 に答える