You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现固定前缀唯一列refno的数值部分插入时自动递增

实现方案

你可以按照以下步骤修改代码实现refno自动递增生成:

1. 模型类新增获取最大编号的方法

在contacts_model中新增方法,用于读取现有refno的最大数字部分:

function get_max_refno() {
    // 截取固定前缀后的数字部分,转换为整数后取最大值
    $this->db->select("MAX(CAST(SUBSTRING(refno, 6) AS UNSIGNED)) as max_num");
    $this->db->from("crm_contacts");
    $query = $this->db->get();
    $result = $query->row_array();
    // 无数据时默认从1开始生成
    return empty($result['max_num']) ? 1 : $result['max_num'] + 1;
}

注:SUBSTRING(refno, 6)是因为固定前缀LP-C-共占5个字符,数字部分从第6位开始,可根据你实际前缀长度调整参数

2. 控制器代码修改,替换原有refno赋值逻辑

删除原有从POST请求读取refno的逻辑,改为自动拼接生成:

// 获取新的自增数字,拼接得到新refno
$new_num = $this->contacts_model->get_max_refno();
$new_refno = 'LP-C-' . $new_num;

$maindata=array(
    'clients_id'=>$this->session->userdata('clientsessid'),
    'agents_id'=>$this->security->xss_clean($this->input->post('agents_id')),
    'refno'=> $new_refno, // 替换为自动生成的值
    'title'=>$this->security->xss_clean($this->input->post('title'))
);
$insertid=$this->contacts_model->insert($maindata);

3. 并发场景优化(可选)

如果业务存在高并发插入的情况,可能出现多个请求拿到相同最大编号导致refno重复,建议做两个优化:

  • 给数据库crm_contacts表的refno字段加唯一索引,避免重复数据入库
  • 修改模型插入方法加锁避免并发冲突:
function insert($maindata)
{
    $this->db->trans_start();
    // 写锁保证同一时间只有一个插入请求读取编号
    $this->db->query("LOCK TABLES crm_contacts WRITE");
    $this->db->insert("crm_contacts",$maindata);
    $prime = $this->db->insert_id();
    $this->db->query("UNLOCK TABLES");
    $this->db->trans_complete();
    
    return $this->db->trans_status() ? $prime : false;
}

内容的提问来源于stack exchange,提问作者H2O

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 15:39:03