如何实现固定前缀唯一列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
相关产品推荐
相关产品推荐

