解读&修复'外键约束失败'错误

时间:2015-06-16 00:30:30

标签: mysql error-handling

我有这个mysql查询(在提交时将表单中的值添加到表中)。它返回一条错误消息:

$query = "INSERT INTO customers(customerNumber, customerName, contactLastName, contactFirstName, phone, addressLine1, addressLine2, city, state, postalCode, country, salesRepEmployeeNumber, creditLimit) VALUES ('$customer_number', '$customer_name', '$last_name', '$first_name', '$phone_number', '$address_1', '$address_2', '$city', '$state', '$postal_code', '$country', '$sales_number', '$credit_limit')";             
    $result = mysqli_query($dbc, $query)
        or die(mysqli_error($dbc));

错误消息: Cannot add or update a child row: a foreign key constraint failsikb2014_employeescustomers,CONSTRAINT customers_ibfk_1外键(salesRepEmployeeNumber)参考employeesemployeeNumber))

我很难解读“外键约束”所在的位置。失败。如何将特定表的数据库中的选项更改为我能够运行查询?

phpMyAdmin中的选项显示表employees和列employeeNumber(假设是导致错误的位置)。

#   Name    Type    Collation   Attributes  Null    Default Extra   Action
1   employeeNumber int(11)                  No       None   AUTO_INCREMENT

之前我没有使用过数据库,因此我很难理解问题发生的位置和原因。任何关于如何修复约束以正确运行查询的输入将不胜感激。

3 个答案:

答案 0 :(得分:1)

外键constaint失败意味着您尝试将数据输入到另一个表中不存在的一个表的列中。外键约束用于确保插入子表的数据存在于父表中。

在您的情况下,您尝试将数据插入(或不尝试插入)到customers表的salesRepEmployeeNumber列。为了成功执行此操作,您需要确保为employeesRepEmployeeNumber提供的值存在于employees表的employeeNumber列中。

答案 1 :(得分:0)

外键约束错误反对分配给salesRepEmployeeNumber列的值。外键约束是检查为该列提供的值是否匹配 employees表中的行,它正在寻找具有employeeNumber相同值的行,而且它找不到一个。

如果您不希望数据库强制执行外键约束,则不要定义一个。

如果您确实需要约束,则说明您必须为employeeNumber提供有效的NULLsalesRepEmployeeNumber值。

从我们看到的代码来看,SQL语句似乎容易受到SQL注入攻击。 (我们没有看到对包含在SQL文本中的变量值的任何保证。如果这些值中的任何一个可能不安全,那么这些值需要正确转义,例如,使用mysqli_real_escape_string功能

更好的模式是使用准备好的声明绑定占位符

答案 2 :(得分:0)

如果您的外键错误,您可以在phpMyAdmin中轻松删除它。 转到客户表,点击'结构'选项卡,在底部将有一个+索引隐藏列表,展开它并在所选索引上单击DROP。