【问题标题】:How to solve foreign key constraints fails error when manually inserting the child table?手动插入子表时外键约束失败错误如何解决?
【发布时间】:2015-09-08 23:19:16
【问题描述】:

我正在使用 MySQLi 连接到我的数据库,我的问题是我想在数据库中插入,但我收到此错误:

错误:无法添加或更新子行:外键约束 失败(edi_tracker_revised.edi_transaction,约束 edi_transaction_ibfk_1 外键 (edi_doc_type_id) 参考 edi_doc_type (edi_doc_type_id) 更新时删除级联 级联)

这是我的插入代码。

 if ($doc_type == '812') {

            $edi_doc_type_id = "SELECT edi_doc_type_id FROM `edi_doc_type` WHERE doc_type = 812 " ;

            $sql = "INSERT INTO edi_transaction (`sender_id`,`receiver_id`,`isa_number`,`transaction_date`,`gs_number`,`edi_doc_type_id`,`ref_number`,`file_name`,`file_path`,`creation_date`) 
                        VALUES ('$sender_id','$receiver_id','$isa_number','$transaction_date','$gs_number','$edi_doc_type_id','$ref_number','$file_name','$file_path',NOW()) " ;
                $ref_numberArray = explode(',' ,$ref_number); // the ref_number contains the invoice numbers


                //Checking query if it is successful
                if ($conn->query($sql) === false){
                    trigger_error('Wrong SQL: ' . $sql . 'Error: ' . $conn->error , E_USER_ERROR);
                }else {
                    echo "Successful ! Data is inserted in database ^__^" ;

                }
        } 

当我说手动时,我使用 phpmyadmin 插入,现在如果我在 edi_transaction 之前先手动填充我的 edi_doc_type,我该如何解决?我需要 edi_transaction 表中的 edi_doc_type_id。有人可以帮帮我吗?

【问题讨论】:

  • 外键约束的重点是不要在受键约束的表中插入内容。根据您的表之间的关系,您永远不必做您所做的事情。
  • 但我认为这是一种方式,所以我的数据不会有冗余,我认为如果我使用代码插入,我会有冗余数据的趋势......那又如何我应该怎么做?你能帮我吗?

标签: php mysql database mysqli


【解决方案1】:

$edi_doc_type_id = "SELECT edi_doc_type_id FROM `edi_doc_type` WHERE doc_type = 812 " ; 没有执行查询,它只是一个字符串赋值。由于 SELECT edi_doc_type_id FROM `edi_doc_type` WHERE doc_type = 812 不是有效 ID,因此第二个查询失败。

在第二个查询中使用之前,您应该执行 SELECT 查询并读出 edi_doc_type_id。

还值得研究准备好的语句或转义值以防止 SQL 注入攻击。

【讨论】:

【解决方案2】:

即使你试图绕过它们,外键有什么好处-

如果你想要的话,你可以按照下面的方式使用-

set foreign_key_checks=0;
insert....
set foreign_key_checks=1;

但这不是好的做法。

【讨论】:

  • 执行就像我更新的声明一样。您的插入语句将在这两个语句之间。
猜你喜欢
  • 1970-01-01
  • 2011-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多