Php 如何解决错误号:1452-无法添加或更新子行:外键约束失败

Php 如何解决错误号:1452-无法添加或更新子行:外键约束失败,php,codeigniter,phpmyadmin,Php,Codeigniter,Phpmyadmin,错误号码:1452 无法添加或更新子行:外键约束失败(smpstudent,约束FK\u ParentStudent外键(p\u id)引用parent(p\u id)在更新级联时删除级联) 插入学生(学生id,学生代码,姓名,姓名,性别,地址,电话,用户名,密码)值(“‘cbg’、‘sdfsdf’、‘sdfsd’、‘2019年2月13日’、‘男性’、‘fgfhnf’、‘管理’、‘pAQ7oL+R8QJNGY2SIN5MYJURGSJ5TQ3AI5U2NGMYVAQZDS9OOPBFCMCM8Q

错误号码:1452

无法添加或更新子行:外键约束失败(
smp
student
,约束
FK\u ParentStudent
外键(
p\u id
)引用
parent
p\u id
)在更新级联时删除级联)

插入
学生
学生id
学生代码
姓名
姓名
性别
地址
电话
用户名
密码
)值(“‘cbg’、‘sdfsdf’、‘sdfsd’、‘2019年2月13日’、‘男性’、‘fgfhnf’、‘管理’、‘pAQ7oL+R8QJNGY2SIN5MYJURGSJ5TQ3AI5U2NGMYVAQZDS9OOPBFCMCM8QKEWI1C6NBYDMCCZ6NGU+1Tiw=”)

文件名:C:/xampp/htdocs/SMP/system/database/DB_driver.php

电话号码:691

我得到这个错误,我认为这与我在控制器中的函数有关

public function register_students()     {

    // $this->load->model('Register_model','multi_model',TRUE);
    $encrypted_password1 = $this->encrypt->encode($this->input->post('p_pwd'));
    $parent_data = array(
        'p_id' => '',
        'parent_code' => $this->input->post('parent_code'),
        'f_name' => $this->input->post('p_first_name'),
        'l_name' => $this->input->post('p_last_name'),
        'dob' => $this->input->post('p_dob'),
        'address' => $this->input->post('p_address'),
        'tel' => $this->input->post('p_tel_no'),
        'email' => $this->input->post('email'),
        'username' => $this->input->post('p_username'),
        'password' => $encrypted_password1,
    );
        // var_dump($student_data);
        // var_dump($parent_data);

    $result = $this->Model_Action->insertTable('parent', $parent_data);
    $encrypted_password = $this->encrypt->encode($this->input->post('pwd'));
    $student_data = array(
        's_id' => '',
        'student_code' => $this->input->post('student_code'),
        'f_name' => $this->input->post('first_name'),
        'l_name' => $this->input->post('last_name'),
        'dob' => $this->input->post('dob'),
        'gender' => $this->input->post('gender'),
        'address' => $this->input->post('address'),
        'tel' => $this->input->post('tel_no'),
        'username' => $this->input->post('username'),
        'password' => $encrypted_password,
    );
    $result = $this->Model_Action->insertTable('student', $student_data);
    // $result = $this->multi_model->student_register($student_data, $parent_data);
    if($result)         {
        redirect('student');
    }
    else
    {
        redirect('student');
    }
}
模型

创建表格
student
(
s\u id
int(11)非空自动增量,
student\u code
varchar(50)不为空,
f_name
varchar(150)不为空,
l_name
varchar(250)不为空,
DOB
文本不为空,
gender
enum('male','female')不为空,
地址
varchar(450)不为空,
tel
int(50)不为空,
username
varchar(100)不为空,
password
varchar(150)不为空,
p_id
int(11)不为空, 主键(
s_id
), 键
s\u id
s\u id
), 键
p\u id
p\u id
), 约束
FK_ParentStudent
外键(
p_id
)在更新级联时删除级联时引用
parent
p_id
) )ENGINE=InnoDB AUTO_INCREMENT=16默认字符集=1

创建表
parent
(
p\u id
int(11)非空自动增量,
parent\u code
varchar(100)不为空,
f_name
varchar(150)不为空,
l_name
varchar(250)不为空,
DOB
文本不为空,
地址
varchar(250)不为空,
tel
varchar(50)不为空,
email
varchar(250)不为空,
username
varchar(250)不为空,
password
varchar(250)不为空, 主键(
p\u id
), 键
p\u id
p\u id

)ENGINE=InnoDB AUTO_INCREMENT=10默认字符集=latin1

如果插入时您的主键是
p_id
,则不应传递它。请从
$parent_data
中删除此行
'p_id'=>“”,


如果您无法删除或更新数据。请检查数据库表上的外键限制,您可能已经对其进行了限制。

分析PHP代码时,我发现您首先插入父项,用于插入的函数返回父项id,但您没有在学生插入中使用它。如果您将其添加到学生ar中ray它将解决您的问题:

public function register_students()     {
   {...}
   $p_id = $this->Model_Action->insertTable('parent', $parent_data); // Parent it returned

   $encrypted_password = $this->encrypt->encode($this->input->post('pwd'));
   $student_data = array(
       's_id' => '',
       'p_id' => $p_id, // Adding parent id to student_data
       {...}
   );

   $result = $this->Model_Action->insertTable('student', $student_data);
   {...}
}

有关SQL错误的解释

之所以出现此SQL异常错误,是因为在
student
表上,您在父表上定义了一个notnull外键
p\u id
引用
p\u id

CREATE TABLE student (  
  s_id int(11) NOT NULL AUTO_INCREMENT,  
  student_code varchar(50) NOT NULL,  
  f_name varchar(150) NOT NULL,  
  l_name varchar(250) NOT NULL,  
  DOB text NOT NULL,  gender enum('male','female') NOT NULL,  
  address varchar(450) NOT NULL,  
  tel int(50) NOT NULL,  
  username varchar(100) NOT NULL,  
  password varchar(150) NOT NULL,  
  p_id int(11) NOT NULL, 
  PRIMARY KEY (s_id), 
  KEY s_id (s_id), 
  KEY p_id (p_id), 
  CONSTRAINT FK_ParentStudent FOREIGN KEY (p_id) REFERENCES parent (p_id) ON DELETE CASCADE ON UPDATE CASCADE 
)ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=latin1
注意
p_id int(11)NOT NULL
使您无法向
父表传递除有效id引用以外的任何内容。也就是说,您无法从父表传递
'
NULL
或有效id以外的任何其他值。如果希望此外键具有默认值,请编辑SQL以将默认值包含到
p_id
student
表中:


p\u id int(11)DEFAULT NULL

谢谢,我包含了我的sql查询。我认为没有限制非常感谢。在添加了“$p\u id=$this->Model\u Action->insertTable($parent',$parent\u data);”之后,它终于开始工作了。您救了我:D
CREATE TABLE student (  
  s_id int(11) NOT NULL AUTO_INCREMENT,  
  student_code varchar(50) NOT NULL,  
  f_name varchar(150) NOT NULL,  
  l_name varchar(250) NOT NULL,  
  DOB text NOT NULL,  gender enum('male','female') NOT NULL,  
  address varchar(450) NOT NULL,  
  tel int(50) NOT NULL,  
  username varchar(100) NOT NULL,  
  password varchar(150) NOT NULL,  
  p_id int(11) NOT NULL, 
  PRIMARY KEY (s_id), 
  KEY s_id (s_id), 
  KEY p_id (p_id), 
  CONSTRAINT FK_ParentStudent FOREIGN KEY (p_id) REFERENCES parent (p_id) ON DELETE CASCADE ON UPDATE CASCADE 
)ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=latin1