myron_mao 2012-03-29 14:57:16 4073次浏览 4条回复 0 0 0

当数据库表本身存在主键索引,并且主键索引不是number类型,例如char或varchar2 这个时候通过activerecord类来对数据表进行insert,update等操作时,就会出现报错,无法进行下去。 如何解决这个问题?必须要删除数据表的主键索引吗?

  • 回复于 2012-03-29 20:00 举报

    yii官方的解释是,建议使用自增字段作为主键,不过使用中如果不是复合主键应该不会出现你说的问题啊?
    在ar model里声明了主键吗?

    public function primaryKey() {
        return "pk"; //指定非ID主键
        //return array("pk1","pk2"); //复合主键情况
    } 
    
  • 回复于 2012-03-29 20:03 举报

    另外可能就是你的url route需要改

    'urlManager'=>array(
        'showScriptName'=>false, // enable this when .htaccess takes effect on the host
        'urlFormat'=>'path',
        'rules'=>array(
            '<controller:\w+>/<id:\d+>'=>'<controller>/view',
            '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
            '<controller:\w+>/<action:\w+>/<view:\w+>/*'=>'<controller>/<action>',
            '<controller:\w+>/<action:\w+>/<lang:\w+>'=>'<controller>/<action>',
            '<controller:\w+>/<action:\w+>'=>'<controller>/<action>',
        ),
    ),
    

    <id:\d+>改成比如<pk:\w+>

  • 回复于 2012-03-30 00:57 举报

    我还是一个初学者,操作步骤如下
    1.我创建了一张表,4个字段

    create table test
    (
      tableid     CHAR(32) default sys_guid() not null,
      uname     VARCHAR2(50) not null,
      rdindex     NUMBER not null,
      rdflag      NUMBER default 1 not null
    )
    

    其中tableid为主键索引
    2.通过yii的界面,自动生成数据库表的model文件,TEST.php
    3.我写了一段对这张表操作的简单代码

    $db =new TEST();
    $value=array(
        'uname'=>'abc','rdindex'=>1
    );
    $db->attributes=$value;
    $db->insert();
    

    接着就是报错了,先报错说,指向insert方法中的这一句
    throw new CDbException(Yii::t('yii','The active record cannot be inserted to database because it is not new.'));
    把数据表的主键索引去除了,然后在自动生成的TEST.php类里把tableid字段加上,解决这个报错。
    然后报数据类型不对的错误。就是数据表字段rdflag默认为1,系统取回来变成了'1',
    $value数组中加入rdflag=>1,才算通过。
    结果存入数据表中tableid字段的值为'sys_guid()'

    真的让人很无语。。。。。。

  • 回复于 2012-03-30 17:41 举报

    你除错的方向不对,如果主键不是自增型数据,需要用zii生成model之后做以下修改:

    1. 二楼内容
    2. 三楼内容

    否则yii无法找到你的主键肯定CRUD会失败

您需要登录后才可以回复。登录 | 立即注册