错误号:1452无法添加或更新子行:外键约束失败

时间:2017-11-30 15:38:55

标签: php mysql database codeigniter

作为练习,我试图使用CodeIgniter创建一个非常基本的Twitter克隆。我目前正在尝试创建一个简单的注册/注册表单来创建一个帐户并将其添加到数据库表用户。 这些字段是 名字 姓氏 用户名 电子邮件地址 密码 密码确认 < /强>

但是,我收到以下错误。

  

错误号码:1452

     

无法添加或更新子行:外键约束失败(lampusers,CONSTRAINT users_ibfk_1 FOREIGN KEY(user_id)参考tweetsuser_id))

     

INSERT INTO usersfirst_namelast_nameusernameemailpassword)VALUES('fn','ln' ,'username','user @ gmail.com','pw')

     

文件名:models / User_model.php

     

行号:33

我在 Tweet_model.php 中使用 user_id 列加入了我的两个表用户推文

两个表中 user_id 的结构为:

推文表

字段:user_id,类型:INT,长度:11,无符号,密钥:MUL

用户表

字段:user_id,类型:INT,长度:11,无符号,键:PRI,额外:auto_increment

我的代码如下:

控制器: Register.php

class Register extends CI_Controller
{
public function index()
{
  $this->load->model('user_model');

  $this->form_validation->set_rules('first_name', 'First Name', 'required');
  $this->form_validation->set_rules('last_name', 'Last Name', 'required');
  $this->form_validation->set_rules('username', 'Username', 'required');
  $this->form_validation->set_rules('email', 'Email', 'required');
  $this->form_validation->set_rules('password', 'Password', 'required');
  $this->form_validation->set_rules('passconf', 'Password Confirmation', 'required');

    if ($this->form_validation->run() == false) {
        $this->load->view('templates/header');
        $this->load->view('register');
        $this->load->view('templates/footer');
    } else {
        $this->user_model->set_user();
        $this->load->view('templates/header');
        $this->load->view('home');
        $this->load->view('templates/footer');
    }
  }
}

型号: User_model.php     

class User_model extends CI_Model
{
public function __construct()
{
    $this->load->database();
}

public function get_users($user_id = false)
{
    if ($user_id === false) {
        $query = $this->db->get('users');
        return $query->result_array();
    }

    $query = $this->db->get_where('users', array('user_id' => $user_id));
    return $query->row_array();
}

public function set_user()
{
    $url = url_title($this->input->post('user'), 'dash', true);

    $data = array(
      'first_name' => $this->input->post('first_name'),
      'last_name' => $this->input->post('last_name'),
      'username' => $this->input->post('username'),
      'email' => $this->input->post('email'),
      'password' => $this->input->post('password')
    );

    return $this->db->insert('users', $data);
}
}

查看: register.php

<form action="/index.php/register" method="POST">

  <h5>First Name</h5>
  <input type="text" name="first_name" value="" size="50" />

  <h5>Last Name</h5>
  <input type="text" name="last_name" value="" size="50" />

  <h5>Username</h5>
  <input type="text" name="username" value="" size="50" />

  <h5>Email Address</h5>
  <input type="text" name="email" value="" size="50" />

  <h5>Password</h5>
  <input type="text" name="password" value="" size="50" />

  <h5>Password Confirm</h5>
  <input type="text" name="passconf" value="" size="50" />

  <div><input type="submit" value="Register" /></div>

</form>

Tweet_model.php

class Tweet_model extends CI_Model
{
public function __construct()
{
    $this->load->database();
}

public function get_tweets($tweet_id = false)
{
    if ($tweet_id === false) {
        $this->db->join('users', 'tweets.user_id = users.user_id');
        $query = $this->db->get('tweets');
        return $query->result_array();
    }

    $query = $this->db->get_where('tweets', array('tweet_id' => $tweet_id));
    return $query->row_array();
}

public function set_tweet()
{
    $tweet = url_title($this->input->post('tweet'), 'dash', true);

    $data = array(
    'tweet' => $this->input->post('tweet')
);

    return $this->db->insert('tweets', $data);
}
}

编辑:这是倒退。但是现在我想在发布推文时遇到同样的问题。

  

错误号码:1452

     

无法添加或更新子行:外键约束失败(lamptweets,CONSTRAINT tweets_ibfk_1 FOREIGN KEY(user_id)参考usersuser_id))

     

INSERT INTO tweetstweet)VALUES('测试推文')

     

文件名:models / Tweet_model.php

     

行号:30

2 个答案:

答案 0 :(得分:1)

似乎外键约束是向后定义的。

我对问题中展示的特定用例没有理解......但我怀疑这是usertweet之间的一对多关系

tweet由一个user组成。

user可以为零,一个或多个tweet

通常情况下,我们与“很多”方面的外键实现一对多关系,指向“一方”

e.g。

 CREATE TABLE tweet 
 ( ...
 , user_id
 , ...
 , CONSTRAINT FK_tweet_user FOREIGN KEY (user_id) REFERENCES user (id) 
 , ...

此约束将阻止将行添加到tweet,其中包含“无效”user_id(不引用user中的行的值)

如果我们向后定义外键,反过来说,只要在user中找不到匹配值,我们就会阻止向tweet添加行。也就是说,在我们在tweet中为该用户添加一行之前,我们无法添加用户。

修改

一旦外键以正确方式翻转,我们需要在向user_id插入行时为tweet列提供值。

INSERT INTO tweet (user_id, tweet) VALUES 
--                 ^^^^^^^^
(  42, 'rt this if you’re ready for #NoMore with @PRETTYMUCH and @FrencHMonTanA' )
;
-- ^^^ 

答案 1 :(得分:0)

user_id是AUTO_INCREMENT吗?如果没有,您将始终尝试插入user_id 0(默认INT值),并且由于它是唯一的,它会失败。