【问题标题】:phpMyAdmin - foreign key not workingphpMyAdmin - 外键不起作用
【发布时间】:2016-04-13 12:11:28
【问题描述】:

我正在努力在我的 cPanel 服务器上的 phpMyAdmin 中的两个表之间建立外键关系——为了简单起见,我只称它们为“父”和“子”。在子表中,我有一个 parent_id 列,我想用父表中的 id 号填充该列。我已经遵循了一些关于这方面的教程,但它似乎不起作用 - 创建了新记录,但子表上的 parent_id 列仍然为 NULL。

我的 html 表单数据被传递给 PHP,PHP 在同一操作中将数据插入到两个单独的表中,父表和子表。父表和子表本质上是重复的,但将来我可能会添加额外的子表,因此需要外键关系 - 基本上是具有未连接本地表的主表。

在 phpMyAdmin 中,我将父表和子表的存储引擎都设置为 InnoDB。在子表中,我添加了一个 parent_id 列,将默认设置为 NULL,并允许为 NULL。然后我对该列进行索引,并将外键约束设置为“父”。“ID”。 phpMyAdmin 自动生成了一个约束名称“child_ibfk_1”。 ON DELETE 和 ON UPDATE 都设置为级联。

当我创建新记录时,两个表都正确填充,但子表中的 parent_id 列是 NULL 而不是父表的 ID。

谁能看到我在这里做错了什么?非常感谢。

编辑 - php 插入语句:

$sql = "INSERT INTO parent (date, time, latitude, longitude, accuracy, species, deadinjured, sex, age, name, contact_info, notes, source)
VALUES ('$date', '$time', '$latitude', '$longitude', '$accuracy', '$species', '$deadinjured', '$sex', '$age', '$name', '$contact_info', '$notes', 'source 1');";

$sql .= "INSERT INTO child (date, time, latitude, longitude, accuracy, species, deadinjured, sex, age, name, contact_info, notes)
VALUES ('$date', '$time', '$latitude', '$longitude', '$accuracy', '$species', '$deadinjured', '$sex', '$age', '$name', '$contact_info', '$notes');";

【问题讨论】:

  • When I create a new record, both tables are populated correctly -- 我们能看到您正在执行的确切查询吗?
  • 马上来 - 我会将它们编辑到我原来​​的问题中。
  • 您必须在插入子表的INSERT 命令中显式提供父 ID。您可以使用 API 的相关功能在插入父记录后立即获取它的 ID:e.g. mysql_insert_id()mysqli::$insert_idPDO::lastInsertId
  • 是的,谢谢,这绝对是正确的答案。

标签: php mysql database phpmyadmin foreign-keys


【解决方案1】:

这里的问题是您需要手动将child 记录与其在parent 表中的关联记录链接起来,显式 设置child.parent_id 的值。您的外键约束仅用于强制执行一条规则,即“当将值添加到 child.parent_id 时,它需要匹配 parent.id 中的值。”

此外,您的ON UPDATEON DELETE 级联只有在您设置了child.parent_id 的值后才能工作。

【讨论】:

  • 啊,我明白了!非常感谢。
  • 没问题!正如 Eggyal 所述,您可以轻松获取 parent.id 的新值,然后将其插入到 child.parent_id 中。
  • 是的,你们成功了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-02
  • 2012-06-05
  • 1970-01-01
  • 2014-09-25
  • 2014-12-03
  • 2011-07-25
相关资源
最近更新 更多