thinkphp5连接oracle用insert插入数据失败

使用最新版TP5框架,insert操作失败,应该是id的问题,官方没看到关于oracle介绍,不知道该如何写,新人,求点拨,附插入mysql的代码写法,求改成oracle,(oracle建好序列号,索引)

function writelog($uid,$username,$description,$status)
{
    $data['admin_id'] = $uid;
    $data['admin_name'] = $username;
    $data['description'] = $description;
    $data['status'] = $status;
    $data['ip'] = request()->ip();
    $data['add_time'] = time();
    $log = Db::name('think_log')->insert($data);

}

图片描述

使用上述代码报错提示(主键ID没有值)
图片描述

阅读 5.6k
4 个回答

oracle没有自增字段,LOG_ID字段的值必须人工赋值,人工写sql的话大概是这样的:

INSERT INTO TINK_LOG(LOG_ID) VALUES(S_T_THINK_LOG.NEXTVAL)

如果TP不支持取oracle序列的值,可以在表TINK_LOG中创建一个触发器:

create or replace trigger trg_TINK_LOG
  before insert on TINK_LOG
  for each row
declare
begin
  :new.LOG_ID:= S_T_THINK_LOG.NEXTVAL;  
end trg_t1;

oracle主键log_id 不能自动递增
有两个办法:
1、使用oracle的自动增长序列
创建序列

create sequence S_T_THINK_LOG
increment by 1  //指定序列以1递增,如果没指定,默认值1会使用
start with 1        //由1开始计数
nomaxvalue     //不设置最大值
minvalue 1      //设置最小值1
cache 20        //预分配缓存大小为20
order
// 获取下一个自增ID
public function getNextSeq(){ 
  $sql = "select S_T_THINK_LOG.nextval id from sys.dual";
  $result = $this->query($sql); 
  $nextId = $result[0]['id'];
  return $nextId;
}

function writelog($uid,$username,$description,$status)
{
    // 注意这里啦 
    // 注意这里啦 
    $data['log_id'] = $this->getNextSeq();
    
    $data['admin_id'] = $uid;
    $data['admin_name'] = $username;
    $data['description'] = $description;
    $data['status'] = $status;
    $data['ip'] = request()->ip();
    $data['add_time'] = time();
    $log = Db::name('think_log')->insert($data);

}

第二种,就是楼上说的 触发器啦

create or replace trigger trg_TINK_LOG
  before insert on TINK_LOG
  for each row
declare
begin
  :think_log.LOG_ID:= S_T_THINK_LOG.NEXTVAL;  
end trg_t1;
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题