Как решить номер ошибки: 1452 - Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполнено - PullRequest
0 голосов
/ 09 февраля 2019

Номер ошибки: 1452

Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполняется (smp. student, CONSTRAINT FK_ParentStudent FOREIGN KEY (p_id) ССЫЛКИparent (p_id) НА УДАЛЕННОМ КАСКАДЕ НА ОБНОВЛЕНИИ КАСКАДА)

ВСТАВИТЬ В student (s_id, student_code, f_name, l_name, dob, gender, address, tel, username, password) ЗНАЧЕНИЯ ('', 'cbg', 'sdfsdf', 'sdfsd', '02 / 13/2019 ',' male ',' fgfhnf ','', 'admin', 'pAQ7oL + r8QJNgy2siN5moyJUhrgSj5tq3Ai5U2ngMyvaQZDsS9ooPbfcCm8qKEWi1C6nbYdMCyscz6ngU + 1Tiw ==' * /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');
    }
}

модель

 function insertTable($table, $data) {
     $this->db->insert($table, $data);
     return $this->db->insert_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 текст NOT NULL), gender enum ('male', 'female') NOT NULL, address varchar (450) NOTNULL, tel int (50) NOT NULL, username varchar (100) NOT NULL, password varchar (150) NOT NULL, p_id int (11) NOT NULL, ПЕРВИЧНЫЙ КЛЮЧ (s_id),KEY s_id (s_id), KEY p_id (p_id), CONSTRAINT FK_ParentStudent FOREIGN KEY (p_id) ССЫЛКИ parent (p_id) НА УДАЛИТЬ КАСКАД НА ОБНОВЛЕНИИ КАСКАДОВ) ENGINE = InnoDBAUTO_INCREMENT = 16 CHARSET ПО УМОЛЧАНИЮ = latin1

CREATE TABLE parent (p_id int (11) NOT NULL AUTO_INCREMENT, parent_code varchar (100) NOT NULL, f_name varchar (150) NOT NULL,l_name varchar (250) NOT NULL, DOB текст NOT NULL, address varchar (250) NOT NULL, tel varchar (50) NOT NULL, email varchar (250) NOT NULL, usernamevarchar (250) NOT NULL, password varchar (250) NOT NULL, первичный ключ (p_id), ключ p_id (p_id)) ENGINE = InnoDB AUTO_INCREMENT = 10 CHARSET по умолчанию = латинский 1

Ответы [ 2 ]

0 голосов
/ 10 февраля 2019

Анализируя PHP-код Я понял, что сначала вы вставляете родительский элемент, а функция, которую вы используете для вставки, возвращает родительский идентификатор, но вы не используете его для вставки ученика.Если вы добавите его в массив студентов, это решит вашу проблему:

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 вы определили не нуль внешний ключ p_id, ссылающийся на p_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делает невозможным передачу чего-либо, кроме действительной ссылки на идентификатор в таблицу parent.Тем не менее, вы не можете передать '' или null или любое другое значение, кроме действительного идентификатора из родительской таблицы.Если вы хотите, чтобы этот внешний ключ имел значение по умолчанию, отредактируйте ваш SQL, включив в него значение по умолчанию p_id в таблице student:

p_id int(11) DEFAULT NULL

0 голосов
/ 10 февраля 2019

Если p_id является вашим первичным ключом, вы не должны передавать его при вставке.Удалите эту строку 'p_id' => '', из $parent_data

Если вы не можете удалить или обновить данные.Пожалуйста, проверьте ограничение foreign_key для таблицы базы данных, возможно, вы его ограничили.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...