注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

牧野流星

每个人心中都有一个梦想..........

 
 
 

日志

 
 

Oracle自增字段实现之ThinkPHP  

2013-12-24 17:02:24|  分类: Oracle |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
转自http://www.thinkphp.cn/code/480.html
第二种方法试验未成功

Oracle数据库和Mysql数据库不同,它没有Mysql的Auto_increment自动增长的属性。所以我们需要建立Oracle的 Sequence序列来实现自动增长字段。有人认为是ThinkPHP不支持这个方法,其实我觉着这种说法不对,应该是Oracle数据库不支持才对。故 命名本文标题为:Oracle自增字段实现。
这边就以表tb_user为例,实现其字段id的自动增长方法,这里在配置文件config.php中增加如下几项设置:
 'DB_PREFIX'=>'tb_',//表名前缀  
 'DB_SEQUENCE_PREFIX' =>    'seq_',//序列名前缀
 'DB_TRIGGER_PREFIX'    =>    'tig_',//触发器名前缀
复制代码
一、[序列+触发器]官方DbOracle.class.php驱动描述的方法:
1.首先在Oracle中建立表User的序列seq_user如下:
-- Create sequence 
create sequence SEQ_USER
minvalue 1
maxvalue 999999999999999999999999999
start with 1
increment by 1
nocache;
复制代码
2.在Oracle中建立SEQ_USER的触发器tig_user如下:
create or replace trigger tig_user
  before insert on tb_user --tb_user是表名
  for each row
declare
  nextid number;
 begin
  if :new.id is null or :new.id = 0 then
    select seq_user.nextval --执行seq_user获取下一个序列
      into nextid
      from sys.dual;
    :new.id := nextid; ---通过特殊变量:new在新增的时候写入上面获取的序列号
  end if;
 end tig_user;
复制代码
3.上面两步完成后其实就已经基本完成了,在UserAction中写插入数据代码如下:
function insert() {
    $model = D('User');
    if (false === $model->create ()) {//创建数据对象
        $this->error($model->getError());
    }
    $list=$model->add();//保存数据对象
    if ($list!==false) { //判断是否成功
        $this->success('成功!');
    }else {
        $this->error('失败!');
    }
 }
复制代码
以上是官方Oracle驱动默认的方法,跟Mysql的代码方法是一样的,不需要在ThinkPHP代码中定义ID字段,基本上在Oracle中就完成了。
二、[TP+序列](未成功)但是很多时候,有人会认为过多使用触发器来实现Oracle字段自增,容易造成死锁或者阻塞,OK,那么下面方法就不用触发器来实现:
1.同样你需要在Oracle建立序列,同上面方法第1步。
2.在UserModel中定义一个方法getNextSeq如下:
public function getNextSeq(){ 
  $sql = "select seq_user.nextval id from sys.dual";
  $result = $this->query($sql); 
  $nextId = $result[0]['id'];
  return $nextId;
 }
复制代码
3.然后在UserModel中自动填充方法中就可以调用getNextSeq,如下:
public $_auto        =    array(
  array('id','getNextSeq',self::MODEL_INSERT,'callback'),
 );
复制代码
当然你也可以在Action方法中调用getNextSeq方法来自己填充id字段,或者直接使用query语句:insert into tb_user(id) values(seq_user.nextval);来实现。
  评论这张
 
阅读(586)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018