完整性约束违规: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 无法添加或更新子行:外键约束失败

完整性约束违规:1452 无法添加或更新子行:外键约束失败

Innobyte 插件问题:SQLSTATE [23000]:完整性约束违规:1452 无法添加或更新子行

SQLSTATE [23000]:完整性约束违规:1452 无法添加或更新子行:外键约束失败

完整性约束违规:1452 无法添加或更新子行:外键约束失败(Laravel 应用程序)

SQLSTATE [23000]:完整性约束违规:1452 无法添加或更新子行:外键约束失败 - Laravel