Php 如何解决错误号:1452-无法添加或更新子行:外键约束失败
错误号码: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
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