完整性约束违规:1452 无法将子行添加或更新到我的数据库中
Posted
技术标签:
【中文标题】完整性约束违规:1452 无法将子行添加或更新到我的数据库中【英文标题】:Integrity constraint violation: 1452 Cannot add or update a child row into my Database 【发布时间】:2017-04-21 10:33:46 【问题描述】:我在将子行插入数据库时遇到问题。总是会收到错误插入错误:SQLSTATE [23000]:完整性约束违规:1452 无法添加或更新子行:外键约束失败(doku
.server
,CONSTRAINT kunde->server
FOREIGN KEY (kunden_id
) 参考kunden
(id
))
代码是
<form method="POST" action="server-eintragen.php">
<div class="form-group">
<label for="firmenname">Servername</label>
<input type="text" class="form-control" name="name" placeholder="Servername" >
</div>
<div class="form-group">
<label for="Addresse">Bestückung</label>
<input type="text" class="form-control" name="CPU" placeholder="Welche CPU?" >
<input type="text" class="form-control" name="CPU-Anzahl" placeholder="Wieviele Sockets?" >
<input type="text" class="form-control" name="RAM" placeholder="Wieviel RAM" >
<input type="text" class="form-control" name="Festplatte" placeholder="Wie groß ist die Festplatte" >
<input type="hidden" class="form-control" name="kunden_id" value=<?php htmlentities($_GET['kundenid']) ?> >
</div>
<div class="form-group">
<button type="submit" class="btn btn-primary">Abschicken</button>
</div>
</form>
和
<?php
error_reporting(E_ALL);
error_reporting(-1);
include "../../includes/php/db.php";
$name = htmlentities($_POST['name']);
$cpu = htmlentities($_POST['CPU']);
$cpu_anzahl = htmlentities($_POST['CPU-Anzahl']);
$ram= htmlentities($_POST['RAM']);
$festplatte = htmlentities($_POST['Festplatte']);
$created_at = date("Y-m-d H:i:s");
$updated_at = date("Y-m-d H:i:s");
$kunden_id = htmlentities($_POST['kundenid']);
$stmt = $dbh->prepare('INSERT INTO server (name, cpu, cpu_anzahl, ram, festplatte, created_at, updated_at, kunden_id)VALUES( :name, :cpu, :cpu_anzahl, :ram, :festplatte, :created_at, :updated_at, :kunden_id)');
try
$stmt->execute(
array(
'name' => $name,
'cpu' => $cpu,
'cpu_anzahl' => $cpu_anzahl,
'ram' => $ram,
'festplatte' => $festplatte,
'created_at' => $created_at,
'updated_at' => $updated_at,
'kunden_id' => $kunden_id
)
);
catch (PDOException $e)
echo 'Insert Error: ' . $e->getMessage() . "\n";
?>
我的数据库设计是这样的:http://www.directupload.net/file/d/4698/vczudxas_jpg.htm
【问题讨论】:
那么$kunden_id
的值是多少,在数据库中是否存在?
我认为您在 $kunden_id 变量中获得了一个在父表 (kunden) 中不可用的 id。请打印该变量以查看其值
$kunden_id 在我的测试用例 3 中,这是我数据库中 kunde(客户)的 id。是的,回声也是“3”,所以它应该存在于我的数据库中,但在服务器列中的客户 [id] 列中它不存在我想用新的服务器数据插入它
directupload.net/file/d/4698/3tidwhvz_jpg.htm
【参考方案1】:
错误是不言自明的Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails
当两个表绑定foreign key
关系时说
tbl_parent(id) -> tbl_child(cid); // here cid refers to id
然后在cid
列中,您只能插入那些已经存在于id
列中的值。
在您的情况下,我认为您正在尝试在父表中不存在的子表中插入一个值。
所以根据您的最后一条评论,$kunden_id
那里是空白的,所以我不能插入,因为父表中不存在空白(因为父表引用列是唯一或主键列)
【讨论】:
是的,但是在我的 id 列中有值“3”,它等于我的插入...directupload.net/file/d/4698/3tidwhvz_jpg.htm 回显准备好的查询并在 mysql 终端上运行它,看看会发生什么 手动操作。所以我的代码中一定有一些错误。 在上面发布的代码中显示相同查询的错误? 没有。我试过 INSERT INTO server (name, cpu, cpu_anzahl, ram, festplatte, created_at, updated_at, kunden_id)VALUES('test', 'test', '1', '1', '1', 'a timestamp', '时间戳','3'),这就是工作。所以它不是查询它必须是交接中的东西【参考方案2】:您忘记了隐藏字段值周围的引号“”,如果添加它们,则它不为空,并且一切正常。
您还应该检查参数是否为空,并且还应该检查具有 kunden_id 的 kunde 是否存在,因为可以操纵 POST 参数并更新用户无权使用的 kunde。
另外,你只需要htmlentities来输出,如果你用实体插入,你用实体输出,这是错误的,你可以在这里看到:https://3v4l.org/5dNGO
提示:使用 Eclipse 之类的 IDE,或者如果您负担得起的话,使用 PHPStorm,那么您一眼就能看到它。只需查看问题中的代码即可。
【讨论】:
谢谢。如果我想使用一些外键(kunden_id)将多行插入到我的数据库中,我该怎么做,因为它必须是唯一的或索引?就像我想为一个客户拥有 3 个服务器,但仍链接到客户 ID 如果可行,您能否接受答案? :D 它必须是一个索引,而不是唯一的,就像这样:sqlfiddle.com/#!9/629366/2以上是关于完整性约束违规:1452 无法将子行添加或更新到我的数据库中的主要内容,如果未能解决你的问题,请参考以下文章
SQLSTATE[23000]:完整性约束违规 1452 无法添加或更新子行:外键约束失败
Innobyte 插件问题:SQLSTATE [23000]:完整性约束违规:1452 无法添加或更新子行
SQLSTATE [23000]:完整性约束违规:1452 无法添加或更新子行:外键约束失败