首页 > php教程 > php手册 > 正文

Oracle自增字段实现之ThinkPHP

php中文网
发布: 2016-06-07 11:43:05
原创
1363人浏览过

Oracle数据库和Mysql数据库不同,它没有Mysql的Auto_increment自动增长的属性。所以我们需要建立Oracle的Sequence序列来实现自动增长字段。有人认为是ThinkPHP不支持这个方法,其实我觉着这种说法不对,应该是Oracle数据库不支持才对。故命名本文标题为:Oracle自增字段实现。
这边就以表tb_user为例,实现其字段id的自动增长方法,这里在配置文件config.php中增加如下几项设置: 'DB_PREFIX'=&gt;'tb_',//表名前缀  <br>  'DB_SEQUENCE_PREFIX' =&gt;    'seq_',//序列名前缀<br>  'DB_TRIGGER_PREFIX'    =&gt;    '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-&gt;create ()) {//创建数据对象<br>         $this-&gt;error($model-&gt;getError());<br>     }<br>     $list=$model-&gt;add();//保存数据对象<br>     if ($list!==false) { //判断是否成功<br>         $this-&gt;success('成功!');<br>     }else {<br>         $this-&gt;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-&gt;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元

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号