Php 错误号:1452无法添加或更新子行:外键约束失败
作为练习,我尝试使用CodeIgniter创建一个非常基本的Twitter克隆。我目前正在尝试创建一个简单的注册/注册表单,以创建一个帐户并将其添加到数据库表users。 这些字段是名字,姓氏,用户名,电子邮件地址,密码,以及密码确认 但是,我得到了以下错误 错误号码: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','
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中加入了两个表users和tweets,使用每个表中的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);
}
}