我有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的页面
在那个页面上我必须写三个不同的表(学生,学生信息和时间)
我的代码就是休闲:
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
, 约束times_ibfk_2
外键(id
)参考students
(id
)ON UPETE CASCADE ON UPDATE CASCADE)
再加上这个,第一个查询(students.php和第二个查询studentinfo.php) 插入就好了。相同的ID,登录到表格中的signintime会出现问题:次。
在phpmyadmin中,两个表(studentinfo和times)都配置相同,两者都有删除级联并更新到原始表(学生),因为学生他/她启动会话(这是PK ID)。
我该如何解决这个错误?
编辑:
<?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());
}
?>
答案 0 :(得分:0)
你的桌面设计对我来说不对劲。我假设times
表中的students
表中的每一行都有多个条目。在这种情况下,您需要times
中的以下列:
id - PK
student_id - FK
signintime
counselor_start_time
additional_time
finish_time
然后,特定学生的每一行都会有相同的student_id
值,但值不同id
。
答案 1 :(得分: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');
有两个表:StudentList
和AddressList
。表Address
是子表,它依赖于表StudentList
(也称为父表)。允许在表StudentID
的列AddressList
上插入的唯一值仅为1 and 2
,因为这些值是表ID
上找到的唯一StudentList
。
当您尝试在表1 and 2
上插入ID为Address
以外的记录时,例如
INSERT INTO AddressList VALUES (1, 'Other Address');
它会产生错误,告诉:
无法添加或更新子行:外键约束失败 (
db_2_ec2e8
。addresslist
,CONSTRAINTtb_fk
FOREIGN KEY (StudentID
)参考studentlist
(ID
)):
因为父表上没有插入表StudentID
列的值( StudentList )。
所以,我希望这会帮助你理解。