我不确定我的外键是不是有效

Posted

技术标签:

【中文标题】我不确定我的外键是不是有效【英文标题】:I'm not sure if my foreign key is working我不确定我的外键是否有效 【发布时间】:2018-06-25 10:39:57 【问题描述】:

我已经建立了一个员工可以发送反馈的系统。

反馈表:

现在我的数据库中有两个表,tbl_feedback 和employee:

tbl_feedback:

员工:

我的 tbl_feedback 中的employee_id 是一个外键,它引用了employee 表中的id。

我的问题是,是否真的有必要将员工 ID 放在我的表单上才能正常工作?因为我注意到当我删除表单上的员工 ID 时,我收到了一个错误。这是否也意味着我没有将employee_id 列设置为外键?正常吗?

这是我的插入反馈 php 代码:

<?php
require_once ('database.php');

if (isset($_POST['send'])) 

$employee_id = $_POST['employee_id'];
$full_name = $_POST['full_name'];
$email = $_POST['email'];
$website = ($_POST['website']);
$message = ($_POST['message']);


$database->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$insert_query = "INSERT INTO tbl_feedback (employee_id, full_name, email, website, message)
VALUES (?, ?, ?, ?, ?)";

$insert = $database->prepare($insert_query);
$insert->execute(array($employee_id, $full_name, $email, $website, $message));

echo "<script>alert('Successfully sent!'); window.location='feedback.php'</script>";


?>

这是我创建 tbl_feedback 的方式:

CREATE TABLE tbl_feedback (
  id int NOT NULL AUTO_INCREMENT,
  employee_id int NOT NULL,
  full_name varchar(100) NOT NULL,
  email varchar(100) NOT NULL,
  website varchar(100) NOT NULL,
  message varchar(100) NOT NULL,
  PRIMARY KEY (id),
  FOREIGN KEY (employee_id) REFERENCES employee(id)
 );

【问题讨论】:

@PhilippMaurer 你的意思是插入反馈php代码吗?还是您还需要我用来创建表的查询? @PhilippMaurer 提供了我用来创建 tbl_feedback 的 php 代码和查询 @PhilippMaurer 你的意思是如果我从 php 代码中删除employee_id 吗? 你说Because I noticed that when I remove Employee ID on the form, I get an error. 我只是问你是从哪里得到的employee_id,你是什么时候这样做的 @PhilippMaurer 哦,是的,我的意思是当我从 php 代码中删除employee_id 时,我得到了一个错误,所以我想知道是否真的有必要将员工ID 放在表单上 【参考方案1】:

如果您从反馈表中删除employee 信息,而没有从其他来源获取信息,您肯定会遇到问题。

您添加到表中的外键约束只是确保您的表中没有反馈条目,没有对应的员工可以映射它。

这意味着,它不会神奇地将两个表相互映射并确保每个反馈都有一个链接的员工,而是根据每个无法链接到员工的反馈条目引发错误给定id。因此,您遇到的错误实际上证明了您的外键约束正常工作。

因此,即使您有外键约束,您仍然必须在代码中管理映射。

【讨论】:

是的,但这意味着您仍然需要将employee_id 添加到您的表单中,或者找到其他方法来找出填写表单的员工。 非常感谢!我不确定我是否知道您所说的寻找另一种方法来找出哪个员工填写了表格的意思 我确实有一个管理员帐户,您可以在其中查看反馈。这是你的意思吗?抱歉,我真的没听懂。 @AndreF 我的意思是,如果您不希望 employee_id 成为表单的一部分,则必须考虑另一种获取方式。例如,会话,如果您有一个登录名,或者作为 GET 参数,如果每个员工都获得一个个性化的链接。我不能告诉你可能有哪些方式,因为这取决于你的项目。讨论将是要在此社区上讨论的错误。 我明白了。是的,我真的不希望员工 ID 成为表单的一部分,至少我知道还有其他方法可以在没有员工 ID 的情况下完成它。与此同时,我想这会奏效。谢谢!【参考方案2】:

如果表中有外键,则表在插入数据时需要传递键。无论您是通过 Form 传递还是通过 PHP 代码从数据库中获取员工 ID。

【讨论】:

以上是关于我不确定我的外键是不是有效的主要内容,如果未能解决你的问题,请参考以下文章

将我的外键放在哪里以获得最佳数据库设计?

Laravel 5.2 迁移:无法添加 char 数据类型的外键

Oracle 中的外键创建问题

补12.关于mysql的外键约束

从刀片中的外键获取数据

索引键是不是足够或者我应该添加外键