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

Php 错误号:1452无法添加或更新子行:外键约束失败,php,mysql,database,codeigniter,Php,Mysql,Database,Codeigniter,作为练习,我尝试使用CodeIgniter创建一个非常基本的Twitter克隆。我目前正在尝试创建一个简单的注册/注册表单,以创建一个帐户并将其添加到数据库表users。 这些字段是名字,姓氏,用户名,电子邮件地址,密码,以及密码确认 但是,我得到了以下错误 错误号码:1452 无法添加或更新子行:外键约束失败(lampusers,约束users\u ibfk\u 1外键(user\u id)引用tweets(user\u id) 在用户(名字,姓,用户名,电子邮件,密码)中插入值('fn','

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

但是,我得到了以下错误

错误号码:1452

无法添加或更新子行:外键约束失败(
lamp
users
,约束
users\u ibfk\u 1
外键(
user\u id
)引用
tweets
user\u id

用户
名字
用户名
电子邮件
密码
)中插入值('fn','ln','username','user@gmail.com","pw")

文件名:models/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);
}
}
电话号码:33

我在我的Tweet\u model.php中加入了两个表userstweets,使用每个表中的user\u id

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);
}
}
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);
}
}
两个表中的用户id结构如下:

推文表

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

用户表

字段:用户id,类型:INT,长度:11,无符号,键:PRI,额外:自动增量

我的代码如下:

控制器: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>
模型:User\u 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>
编辑:它是向后的。但现在我想发布推特时也遇到了同样的问题

错误号码:1452

无法添加或更新子行:外键约束失败(
lamp
tweets
,约束
tweets\u ibfk\u 1
外键(
user\u id
)引用
用户
user\u id

插入
tweet
tweet
)值(“测试tweet”)

文件名:models/Tweet_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);
}
}
电话号码:30


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

我不了解问题中演示的特定用例。。。但我怀疑
user
tweet

推特
由单个
用户
推特

用户
可以twitter零,一个或多个
tweet

通常,我们使用外键实现一对多关系,从“多”端指向“一”端

e、 g

此约束将阻止将具有“无效”
用户id的行添加到
tweet
(该值不引用
user
中的行)


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

编辑

一旦外键按正确的方式翻转,当我们在
tweet
中插入一行时,我们需要为
用户id
列提供一个值

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

用户id是否为自动增量?如果没有,您将始终尝试插入用户id 0(默认INT值),由于它是唯一的,因此将失败。

用户表上是否有引用tweets表的外键?这应该是另一种方式。好吧,这是因为我是如何在Tweet_模型中加入表的?“我们在Tweet中为该用户添加一行之前不能添加用户”-因为这会阻止一些Tweet被编写,这可能是一件好事-哦,这意味着我必须纠正我在Tweet_model.php中所做的连接,对吗?也许把它放在User_model.php中?@MagnusEriksson:我没有资格做出判断-o@migs:在
get\u tweets
中,我没有看到任何需要更改的
join
。我觉得很好。好的,谢谢。我找到了它,并从用户表中删除了关系。只是现在我在发布一条新tweet时发现了类似的关系问题。如果我不能为users表使用user\u id,我该怎么做?我对这个问题进行了编辑。它是针对users表的,但是将它设置为tweets表的auto_increment会不会导致每次发布新的tweet时user_id都会增加?或者两张桌子上的数据必须完全相同吗?哦,我明白了。您正在用户和tweet之间使用fk。但这似乎是相反的方向。你需要在TWEETS表中输入一个foreing键,其中user_id等于USERS.user_id。你是在反向操作吗?是的,就是这样。但现在我在发布推特时也遇到了同样的问题。如果我不能在用户表上使用user_id,那么我将如何设置这两个表之间的关系?如果你做得好,你就不会遇到同样的问题。Foreing键仅在用户表中不存在用户id时才阻止插入新tweet。users.user\u id是主键吗?编辑:当然,还要确保您插入的推文用户id与现有用户对应。好的,这可能是因为我还没有正确设置登录会话,以便知道哪个用户登录并发布推文。
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);
}
}