0

添加新记录会出错:

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

public function relations()
{
    return array(
        'data' => array(self::HAS_ONE, 'Data', 'id'),
    );
}

这是我添加新记录的代码:

public function actionAdd_Record()
{
    $users = new Users();
    $data = new Data();


    if (isset($_POST['Users']) && isset($_POST['Data'])) {

        if(!empty($_POST['Users_password'])) $_POST['Users']['password']=md5($_POST['Users_password']);
         $users->created_date=date('Y-m-d H:i:s');


        CActiveForm::validate(array($users, $data));
        $users->attributes = $_POST['Users'];
        $data->attributes = $_POST['Data'];

        $valid=$users->validate();
        $valid=$data->validate() && $valid;


        if($valid){
            $users->save();
            $data->save();

            $this->redirect(
                array('view_record',
                    'id'=> $users->id)
            );
        }
    }

    $this->render(
        'add_record', array(
            'users'=> $users,
            'data'=>$data
        )
    );
}

这是第一个表:

    CREATE TABLE IF NOT EXISTS `data` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `investment_amount` float DEFAULT '0' COMMENT '投資額',
  `withdrawals` float DEFAULT '0' COMMENT '引出額',
  `investment_yield` float DEFAULT '0' COMMENT '運用利回り',
  `account_balance` float DEFAULT '0' COMMENT '口座残高',
  `status_account` enum('open','closed') DEFAULT 'open',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=7 ;

和第二张表:

    CREATE TABLE IF NOT EXISTS `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(128) NOT NULL,
  `password` varchar(128) NOT NULL,
  `name` varchar(300) NOT NULL COMMENT '氏名',
  `email` varchar(200) NOT NULL,
  `user_type` enum('normal','admin') NOT NULL DEFAULT 'normal',
  `created_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=9 ;

它给出了这个错误:

CDbCommand 未能执行 SQL 语句:SQLSTATE[23000]:完整性约束违规:1452 无法添加或更新子行:外键约束失败(money_investment. data, CONSTRAINT FK_data_usersFOREIGN KEY ( id) REFERENCES users( id))。执行的 SQL 语句为: INSERT INTO data( investment_amount, withdrawals, investment_yield, account_balance, status_account) VALUES (:yp0, :yp1, :yp2, :yp3, :yp4)

4

4 回答 4

1

这不是 yii 或 PHP 问题,而是数据库问题。

您正在尝试插入一条违反您定义的关于主键的关系的记录。要检查的是关系以及字段长度。

看起来您可能仍然在不存在的列上定义了关系(money_investment?)

于 2012-09-14T15:47:23.503 回答
1

谢谢你的帮助,我解决了我的问题。

我添加$data->id=$users->id;是因为第二张桌子不知道 id。见这里

if($valid){
$users->save();
$data->id=$users->id;
$data->save();


$this->redirect(
    array('view_record',
        'id'=> $users->id)
    );
}
于 2012-09-14T16:48:35.703 回答
0

外键约束不允许您在父母之前在孩子中输入数据.. 有时 sql 引擎 innoDb 和 MyIsam .. 读出它的功能你会知道在外键约束即将出现的问题下首选使用什么 sql 引擎... .

于 2015-09-01T11:26:03.243 回答
0

你粗暴地更新你的桌子。最好的方法是在模型中查看

public function relations()

并将这些关系与您的表格进行比较。任何额外的或错误的关系都可能产生这样的问题。

于 2016-05-27T06:59:10.197 回答