Home > php教程 > php手册 > body text

Oracle自增字段实现之ThinkPHP

WBOY
Release: 2016-06-07 11:43:05
Original
1094 people have browsed it

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

^_^完毕....

AD:真正免费,域名+虚机+企业邮箱=0元

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Recommendations
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template