首页 > 解决方案 > 所有外键都是“空”

问题描述

将数据插入到正常工作的表中时。但是,在查看表格时,我注意到没有一个外键起作用。这是应该从其他表中获取外键的“披萨”BaseIDToppingID

比萨桌

如上图所示,ToppingID 为空。而在实际的“PizzaToppings”表中,如下所示,ToppingID为空:

比萨配料表

目前,我在整个数据库中的所有外键都发生了这种情况。

但是,这会引发以下错误:

完整性约束违规:1452 无法添加或更新子行:外键约束失败 ( pizzadelivery. pizza, CONSTRAINT FK_BaseIDFOREIGN KEY ( BaseID) REFERENCES pizzabase( BaseID))

标签: phpmysqldatabase

解决方案


$toppingID = $stmt -> fetch(PDO::FETCH_ASSOC);

$toppingID这是一个数组,可能最终绑定为'Array'最终查询中的字符串,这显然是一个不存在的 ID 并且违反了您的约束(这就是约束所做的,它们确保数据存在于另一个表中)。

您也不想MAX()用来获取 id;不能保证新 id 在列中具有最高的数字,并且如果您并行执行多个查询,那么它对竞争条件是不安全的。你想要的是获得最后一个插入 id

$stmt = $pdo->prepare('INSERT INTO PizzaToppings ...');
...
$stmt->execute();
$toppingId = $pdo->lastInsertId();

$stmt = $pdo->prepare('INSERT INTO PizzaBase ...');
...
$stmt->execute();
$baseId = $pdo->lastInsertId();

$stmt = $pdo->prepare('INSERT INTO Pizza (..., ToppingID, BaseID) VALUES (..., :ToppingID, :BaseID)');
...
$stmt->bindParam(':ToppingID',$toppingId);
$stmt->bindParam(':BaseID',$baseId);
$stmt->execute();

推荐阅读